2024-09-30 16:36:50 发布
网友
我是python新手,我对变量有一些疑问。 我听说s指的是一个变量,s[:]指的是复制一个值,而不是一个引用。为什么这两个结果是相同的? 我想如果[:]这样做,b将是hello,a仍然是hellQ,但结果不是这样
当您首先将a分配给b时,堆上只有一个实际的列表数据,您应该首先尝试将堆上的另一个列表数据分配给b
a
b
在您的示例中,当您第一次将['h', 'e', 'l', 'l', 'o']赋值给a时,您正在创建一个变量a,该变量指向堆上的实际列表数据。之后,将a赋值给b,这意味着创建一个变量b,指向a所指向的数据,现在结构如下所示:
['h', 'e', 'l', 'l', 'o']
a -> ['h', 'e', 'l', 'l', 'o'] ^ | b
然后,b[-1] = 'q'表示更改b指向的列表数据的最后一个元素,这将导致:
b[-1] = 'q'
a -> ['h', 'e', 'l', 'l', 'q'] ^ | b
之后,b[:] = a表示将b所指向的列表的数据更改为a所指向的列表的数据,在这种情况下,该数据不起任何作用(a和b仍然指向相同的列表数据)。因此,下面的a[-1] = 'Q'和b[-1] = 'o'只是在更改(仅)列表数据,如下所示:
b[:] = a
a[-1] = 'Q'
b[-1] = 'o'
a -> ['h', 'e', 'l', 'l', 'Q'] ^ | b
回到b = a和b[:] = a的区别,如果您想了解b[:] = a与b = a的区别,可以首先将['h', 'e', 'l', 'l', 'o']分配给a,然后将另一个列表[]分配给b,现在结构如下所示:
b = a
[]
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[:]覆盖列表的内容而不创建新引用
b[:]
a和b引用的是同一个列表,所以b[:] = a没有注意到。它将值从自己的列表(使用引用a)复制到自己的列表
它不需要使用copy.deepcopy,它用于复制列表中可变的元素,如list或dict,在您的情况下,str是不可变的,因此它创建了一个新对象
copy.deepcopy
当您首先将
a
分配给b
时,堆上只有一个实际的列表数据,您应该首先尝试将堆上的另一个列表数据分配给b
在您的示例中,当您第一次将
['h', 'e', 'l', 'l', 'o']
赋值给a
时,您正在创建一个变量a
,该变量指向堆上的实际列表数据。之后,将a
赋值给b
,这意味着创建一个变量b
,指向a
所指向的数据,现在结构如下所示:然后,
b[-1] = 'q'
表示更改b
指向的列表数据的最后一个元素,这将导致:之后,
b[:] = a
表示将b
所指向的列表的数据更改为a
所指向的列表的数据,在这种情况下,该数据不起任何作用(a
和b
仍然指向相同的列表数据)。因此,下面的a[-1] = 'Q'
和b[-1] = 'o'
只是在更改(仅)列表数据,如下所示:回到
b = a
和b[:] = a
的区别,如果您想了解b[:] = a
与b = a
的区别,可以首先将['h', 'e', 'l', 'l', 'o']
分配给a
,然后将另一个列表[]
分配给b,现在结构如下所示:然后,如果使用
b[:] = a
,将b
指向的列表的数据更改为a
指向的列表的数据,则会得到如下结构:在此状态下,对
a
指向的列表所做的任何更改都不会影响b
指向的列表。例如,现在使用a[-1] = 'Q'
只会更改a
指向的列表,这会导致如下结构:@SliAce是对的
b[:]
覆盖列表的内容而不创建新引用a
和b
引用的是同一个列表,所以b[:] = a
没有注意到。它将值从自己的列表(使用引用a)复制到自己的列表它不需要使用
copy.deepcopy
,它用于复制列表中可变的元素,如list或dict,在您的情况下,str是不可变的,因此它创建了一个新对象相关问题 更多 >
编程相关推荐