Python:"链式定义"英特尔与名单

时间:2015-04-23 14:03:09

标签: python

我刚刚在Python中定义了变量。即:

a = b = 0
a = 1

给我a=1b=0或a和b是两个独立的变量。

可是:

a = b = []
a.append(0)

给我a = [0]b = [0],或者a和b是对同一对象的两个引用。这对我来说很困惑,这两种情况有何不同?是因为int是原始类型还是因为列表只是指针?

2 个答案:

答案 0 :(得分:13)

ab始终指向同一个对象。但是你不能改变整数,它是不可变的。

在您的第一个示例中,您反弹 a指向另一个对象。你没有在另一个例子中这样做,你从未将另一个对象分配给a

相反,您要求对象a 引用更改自身,以向该对象添加另一个条目。对同一对象(list)的所有其他引用都将看到这些更改。这是因为list对象是可变的。

正确的比较是重新分配a以指向新的列表对象:

a = b = []
a = [0]

现在你反弹ab仍在引用第一个列表对象。

答案 1 :(得分:1)

您必须明白ab只是指向最初为空的列表的引用:

>>> 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