我刚刚在Python中定义了变量。即:
a = b = 0
a = 1
给我a=1
和b=0
或a和b是两个独立的变量。
可是:
a = b = []
a.append(0)
给我a = [0]
和b = [0]
,或者a和b是对同一对象的两个引用。这对我来说很困惑,这两种情况有何不同?是因为int
是原始类型还是因为列表只是指针?
答案 0 :(得分:13)
a
和b
始终指向同一个对象。但是你不能改变整数,它是不可变的。
在您的第一个示例中,您反弹 a
指向另一个对象。你没有在另一个例子中这样做,你从未将另一个对象分配给a
。
相反,您要求对象a
引用更改自身,以向该对象添加另一个条目。对同一对象(list
)的所有其他引用都将看到这些更改。这是因为list
对象是可变的。
正确的比较是重新分配a
以指向新的列表对象:
a = b = []
a = [0]
现在你反弹a
而b
仍在引用第一个列表对象。
答案 1 :(得分:1)
您必须明白a
和b
只是指向最初为空的列表的引用:
>>> a = [] # set variable a to an empty list
>>> b = a # sets b to what a is pointing to
>>> a.append(0) # add a zero to the original
# Step 1: A --> [ ]
# Step 2: A --> [ ] <-- B
# Step 3: A --> [0] <-- B