【问题标题】:What's the difference between list1 = [] list2 = [] and list1 = list2 = [] in python?python中list1 = [] list2 = []和list1 = list2 = []有什么区别?
【发布时间】:2013-10-04 20:04:14
【问题描述】:

我刚开始使用 python,我正在尝试使用列表推导来初始化两个列表。像这样

list1 = list2 = [0.0] * 57

当我这样做并插入这些带有值的列表时,与我分别初始化这些列表时获得的值相比,我得到的值集不同(不正确的值)。喜欢

list1 = [0.0] * 57
list2 = [0.0] * 57

第一种情况发生了什么?为什么这两种情况我得到不同的答案?

【问题讨论】:

  • 我的猜测是等式的 RHS 先被评估,然后是 LHS。我不知道解释器中的评估顺序。
  • @squiguy 不,这两个变量都绑定到 same 列表。

标签: python list list-comprehension


【解决方案1】:

第一个设置list1list2 都引用相同 列表。第二个为每个名称定义了一个新列表。

【讨论】:

  • 哦。知道了。谢谢!只是对此的跟进,当使用像 num1 = num2 = num3 = 0.0 这样的普通数字时,这种方法似乎非常有效,没有任何问题。为什么会这样?
  • @Pradep:数字(以及字符串和其他一些数据类型)是不可变的。您无法更改0 的值,但可以更改列表的元素。这就是为什么这很重要。
【解决方案2】:

在以下情况下,您将创建一个列表并让 2 个变量指向它;即对同一对象的 2 个引用:

list1 = list2 = [123] * 3
list1.append(456)

print list1 =>  # prints [123, 123, 123, 456]
print list2 =>  # prints [123, 123, 123, 456]
print list1 is list2   # prints True

而这会创建 2 个新列表并将一个分配给 list1,另一个分配给 list2

list1 = [123] * 3
list2 = [123] * 3
# or  list1, list2 = [123] * 3, [123] * 3

list1.append(456)

print list1  # prints [123, 123, 123, 456]
print list2  # prints [123, 123, 123]
print list1 is list 2  # prints False

这与值是通过引用复制还是存储在变量中有关。对于整数和字符串等不可变对象,这无关紧要:

# a and b contain the same int object
# but it's OK because int's are immutable
a = b = 1
a += 2  # creates a new int from 1+2 and assigns it to `a`
print b  # => 1  ... b is unchanged
print a  # => 3

换句话说,ints(也不是floats 或strs 等)没有方法可以更改您调用该方法的值;相反,它们都返回该类型的新实例;所以 -5 返回一个新的 int -5 而不是现有的 int 5 修改;此外,a += 2 等价于 a = a + 2,其中 a + 2(即在 a 上调​​用的方法 __add__)返回一个新的 int,其值为 a + 2,并且对它的引用被分配回 a

【讨论】:

    猜你喜欢
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2021-09-10
    • 2020-01-09
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多