Python列表副本和赋值

时间:2017-08-01 07:42:04

标签: python list python-3.x

我正在使用Python 3.x

执行以下代码,无法制定理由。

alist = [10,1000,100]
blist = alist

alist += [34]

print('alist after adding', alist) #this is reflected in blist too
print('change reflects in blist ', blist) 

alist = 35 #but this is not reflected in blist

print('alist after assigning ', alist)
print('change not reflected blist ', blist)

您可以在以下链接中执行

Click to Run

我找不到理由,如果您遇到它,任何指示找到根本原因或您的调查结果都会有所帮助。

由于

2 个答案:

答案 0 :(得分:3)

以下是发生的事情......

  • alist = [10,1000,100]表示对list类型对象的alist引用。
  • blist = alist表示blist也指向与alist积分相同的对象类型,即列表。
  • alist += [34]alist添加34,结果将在alist。 alist仍然引用类型为list的对象。
  • alist = 35表示您已将alist的引用类型从list更改为int,其值为35而不是list
  • 这样做不会影响实际列表,因此blist会显示列表,alist会显示35。

使用type(variable)更好地了解,请检查此...

alist = [10,1000,100]
blist = alist

alist += [34]
print("BEFORE: type of alist", type(alist))
print("BEFORE: type of blist", type(blist))

alist = 35 #but this is not reflected in blist
print("AFTER: type of alist", type(alist))
print("AFTER: type of blist", type(blist))

示例运行

BEFORE: type of alist <class 'list'>
BEFORE: type of blist <class 'list'>
AFTER: type of alist <class 'int'>
AFTER: type of blist <class 'list'>

答案 1 :(得分:2)

声明alist += [35]alist.extend([35])的简写。请参阅docs for extend

变量 alist 是对列表的引用。此列表将附加35.由于变量blist是对同一列表的引用,因此同样发生。

35分配给变量alist时,哪些alist引用了更改。它现在指向此值,blist仍引用该列表。

您在程序中创建的所有数据结构都存储在内存中,您的变量只是对这些内存的引用。某些操作将更改内存中引用的数据,例如extend。变量赋值也会改变变量的含义。