Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 浅层副本(按参考的每个项目)_Python 3.x_Reference - Fatal编程技术网

Python 3.x 浅层副本(按参考的每个项目)

Python 3.x 浅层副本(按参考的每个项目),python-3.x,reference,Python 3.x,Reference,在以下代码中: l1 = [3, [66, 55, 44], (7, 8, 9)] l2 = list(l1) l1.append(100) l1[1].remove(55) l1[0] = 5 print('l1:', l1) print('l2:', l2) l2[1] += [33, 22] l2[2] += (10, 11) print('l1:', l1) print('l2:', l2) () 创建列表的浅表副本时,例如: l1 = [3, [66, 55, 44], (7, 8,

在以下代码中:

l1 = [3, [66, 55, 44], (7, 8, 9)]
l2 = list(l1)
l1.append(100)
l1[1].remove(55)
l1[0] = 5
print('l1:', l1)
print('l2:', l2)
l2[1] += [33, 22]
l2[2] += (10, 11)
print('l1:', l1)
print('l2:', l2)
()

创建列表的浅表副本时,例如:

l1 = [3, [66, 55, 44], (7, 8, 9)]
l2 = list(l1)

l2
中不应该填写原始集装箱所持有的相同物品的参考资料吗?为什么不像内部的元组和列表,3没有引用到原始列表?

引用没有引用到原始容器。相反,两个容器都引用了相同的对象。这表明
l1
l2
都包含对相同对象的引用:

>>> l1=[3, [66, 55, 44], (7, 8, 9)]
>>> l2 = list(l1)
>>> id(l1[0])==id(l2[0])
True
>>> id(l1[1])==id(l2[1])
True
区别在于整数不是可变对象,而列表是可变对象。因此,如果您更改
l1[1][0]
(换句话说
66
),将发生以下情况:

>>> l1[1][0]
66
>>> l1[1][0] += 1
>>> l1
[3, [67, 55, 44], (7, 8, 9)]
>>> l2
[3, [67, 55, 44], (7, 8, 9)]
但如果对
l1
的第一个元素执行此操作,则不会发生相同的情况:

>>> l1[0] += 1
l1
>>> [4, [67, 55, 44], (7, 8, 9)]
l2
>>> [3, [67, 55, 44], (7, 8, 9)]
这就是你想要的
l1[0]
最初指的是常量池中的整数3。如果您更改了该引用的含义,则会更改程序中所有地方的文字
3
的含义(WAS3,现在是4)


事实上,在Fortran IV中可以做到这一点,但人们普遍认为这是一个bug。

非常感谢您的详细解释!现在对我来说已经非常清楚了!我还有一个关于可变对象和不可变对象的问题。例如,像列表一样,它是可变的,因为它本质上是链表?因此,如果您添加或更改列表的元素,标题将指向列表的开头,并且永远不会更改?但是元组仅仅是一个包含每个元素的不可变引用的数据结构?我只是想知道可变和不变的本质,以及为什么它是可变的。非常感谢。可变性/不变性是设计的,与实现无关。Python将源代码常量
3
编译为一个引用以提高效率:这不是因为需要更改引用的内容。Python字符串变量也是不可变的。这并不是因为更改引用的内容没有意义(C程序员总是这样做),而是为了提高效率。在Erlang中,所有变量都是不可变的,就像Python字符串和元组一样。这需要一种不同的(拥护者说更可靠的)编程风格。谢谢博阿古利斯!很好的解释!顺便说一句,我确实认为,与python相比,操纵内存和传递值或指针使C变得非常强大:)