理解python变量赋值

Ale*_*lex 8 python

我正在尝试自学python(和一般的编程),并且对变量赋值有点困惑.我明白,如果我有

>>> a = [1,2,3]
>>> b = a
Run Code Online (Sandbox Code Playgroud)

b指的是内存中的同一个对象a.因此,如果我想创建一个新列表,b使用与当前相同的值a,我将如何实现?

另外,请考虑以下示例:

>>> a = [1, 2, 3]
>>> b = a
>>> x = a[1]
>>> a[1] = 4
>>> print a, b, x
[1, 4, 3] [1, 4, 3] 2
Run Code Online (Sandbox Code Playgroud)

我从这个例子中看到,这x是一个新对象,但b指向a.有人可以向我解释这里发生了什么,为什么x是一个新的对象,但b不是?

ely*_*ely 1

考虑这个例子:

In [20]: a = [[1], [2], [3]]

In [21]: b = a

In [22]: x = a[1]

In [23]: a
Out[23]: [[1], [2], [3]]

In [24]: b
Out[24]: [[1], [2], [3]]

In [25]: x
Out[25]: [2]

In [26]: a[1][0] = 4

In [27]: a
Out[27]: [[1], [4], [3]]

In [28]: b
Out[28]: [[1], [4], [3]]

In [29]: x
Out[29]: [4]
Run Code Online (Sandbox Code Playgroud)

这里的区别在于,当我们修改它时,a[1]我们是通过修改它来实现的,而不是告诉它a[1]引用一个全新的东西。

在你的例子中,当你告诉它x引用任何a[1]所指的内容时,它会引用一些具体的东西,无论a[1]当时是什么,在你的例子中是一个特定的整数。

后来你说a[1]要改变,它就改变了。但它用来指代的东西并没有停止存在(因为x仍然在那里指代它)。

通过说,x = a[1]你并不是在说,x应始终指代a[1]所指的事物。

您所说的x应指此时a[1]指派的任何内容。

同样的情况b也一样,只是被b告知要引用的“具体”事物是一个完整的列表——它可以有变化的内容。

另一个例子:

a = [1, 2, 3,]
b = a

print a, b

# Prints
#[1, 2, 3]
#[1, 2, 3]

a = [4, 5, 6]

print a, b

# Prints
#[4, 5, 6]
#[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)