s[:]和s之间的差异,参考和复制之间的差异

2024-09-30 16:36:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python新手,我对变量有一些疑问。
我听说s指的是一个变量,s[:]指的是复制一个值,而不是一个引用。
为什么这两个结果是相同的?
我想如果[:]这样做,b将是hello,a仍然是hellQ,但结果不是这样

enter image description here


Tags: hello新手hellq
2条回答

当您首先将a分配给b时,堆上只有一个实际的列表数据,您应该首先尝试将堆上的另一个列表数据分配给b

Python Code

在您的示例中,当您第一次将['h', 'e', 'l', 'l', 'o']赋值给a时,您正在创建一个变量a,该变量指向堆上的实际列表数据。之后,将a赋值给b,这意味着创建一个变量b,指向a所指向的数据,现在结构如下所示:

a  -> ['h', 'e', 'l', 'l', 'o']
       ^
       |
b    

然后,b[-1] = 'q'表示更改b指向的列表数据的最后一个元素,这将导致:

a  -> ['h', 'e', 'l', 'l', 'q']
       ^
       |
b    

之后,b[:] = a表示将b所指向的列表的数据更改为a所指向的列表的数据,在这种情况下,该数据不起任何作用(ab仍然指向相同的列表数据)。因此,下面的a[-1] = 'Q'b[-1] = 'o'只是在更改(仅)列表数据,如下所示:

a  -> ['h', 'e', 'l', 'l', 'Q']
       ^
       |
b    
a  -> ['h', 'e', 'l', 'l', 'o']
       ^
       |
b    

回到b = ab[:] = a的区别,如果您想了解b[:] = ab = a的区别,可以首先将['h', 'e', 'l', 'l', 'o']分配给a,然后将另一个列表[]分配给b,现在结构如下所示:

a  -> ['h', 'e', 'l', 'l', 'o']

b  -> []

然后,如果使用b[:] = a,将b指向的列表的数据更改为a指向的列表的数据,则会得到如下结构:

a  -> ['h', 'e', 'l', 'l', 'o']

b  -> ['h', 'e', 'l', 'l', 'o']

在此状态下,对a指向的列表所做的任何更改都不会影响b指向的列表。例如,现在使用a[-1] = 'Q'只会更改a指向的列表,这会导致如下结构:

a  -> ['h', 'e', 'l', 'l', 'Q']

b  -> ['h', 'e', 'l', 'l', 'o']

@SliAce是对的

b[:]覆盖列表的内容而不创建新引用

ab引用的是同一个列表,所以b[:] = a没有注意到。它将值从自己的列表(使用引用a)复制到自己的列表

它不需要使用copy.deepcopy,它用于复制列表中可变的元素,如list或dict,在您的情况下,str是不可变的,因此它创建了一个新对象

相关问题 更多 >