查询python中mutable / non-mutable类型的Name绑定

时间:2014-07-10 10:57:05

标签: python

基于下面的python代码示例和图表,

>>> i=2
>>> j=i
>>> i += 2
>>> j
2

>>> s1 = 'abc'
>>> s2 = s1
>>> s1 = 'def'
>>> s2
'abc'

>>> li = ('a', 'b')
>>> lj = li
>>> lj
('a', 'b')
>>> li = ('d', 'e')
>>> lj
('a', 'b')

>>> l1 = ['physics', 'chemistry', 1997, 2000]
>>> l2 = l1
>>> l2
['physics', 'chemistry', 1997, 2000]
>>> l1.append('math')
>>> l2
['physics', 'chemistry', 1997, 2000, 'math']
>>> l1 = ['english']
>>> l2
['physics', 'chemistry', 1997, 2000, 'math']
>>> 

>>> def square(x):
        return mul(x, x)
>>> f = square
>>> f
<function square at 0x00000000031F9848>
>>> square
<function square at 0x00000000031F9848>
>>> def square(x):
        return x * x
>>> f
<function square at 0x00000000031F9848>
>>> square
<function square at 0x000000000325D148>

names

我的问题是:

我可以这么说,python中没有像引用变量那样的东西吗?运行时中任何类型的变量都是name但不是reference,我是否正确?

2 个答案:

答案 0 :(得分:1)

是的,这是正确的。

请注意,您的示例中没有一个实际涉及可变类型。但是,如果他们这样做了,你会看到完全相同的东西:除了,当然,你还可以改变项目的内容。

>>> ll = ['1', '2', '3']
>>> lm = ll
>>> lm
['1', '2', '3']
>>> ll.append('4')
>>> ll
['1', '2', '3', '4']
>>> lm
['1', '2', '3', '4']
>>> lm = ['5']
>>> lm
['5']
>>> ll
['1', '2', '3', '4']

请注意,更改内容会影响两个列表,但将lm重新绑定到新列表不会影响ll

答案 1 :(得分:0)

排序。 Python没有pass-by-reference,如果这就是你要求的。但Python变量是对Python对象的所有引用。因此

>>> a = 1
>>> b = a

使ab指向同一个对象(在本例中为整数1,但它可能是一个更复杂的对象)。你可以看到这个,因为

>>> id(a) == id(b)
True
相关问题