Python 3.x python整数与列表中的引用是如何工作的?在列表中,两个值都是相同的,为什么整数部分中的值不是2?
列表引用附加代码Python 3.x python整数与列表中的引用是如何工作的?在列表中,两个值都是相同的,为什么整数部分中的值不是2?,python-3.x,list,reference,int,python-3.6,Python 3.x,List,Reference,Int,Python 3.6,列表引用附加代码 a = [1,2,3,4,5] b = a b.append(6) print(a) print(b) #ans: [1,2,3,4,5,6] [1,2,3,4,5,6] 整数引用 a = 1 b = a b +=1 print(a) print(b) #ans: 1 2 python整数与列表中的引用是如何工作的?在列表中,两个值都是相同的,为什么整数部分中的值不是2 在Python中,一切都是对象。每件事都是一个地址(指针)的名称 在该页面上,您可以向下滚动并找到以下内
a = [1,2,3,4,5]
b = a
b.append(6)
print(a)
print(b)
#ans:
[1,2,3,4,5,6]
[1,2,3,4,5,6]
整数引用
a = 1
b = a
b +=1
print(a)
print(b)
#ans:
1
2
python整数与列表中的引用是如何工作的?在列表中,两个值都是相同的,为什么整数部分中的值不是2 在Python中,一切都是对象。每件事都是一个地址(指针)的名称 在该页面上,您可以向下滚动并找到以下内容: 数字对象是不可变的;一旦创造了价值,它们就永远不会改变 在下面,您将看到定义的
int
类型,因此您的第二个示例非常有用
在同一页的顶部,您将看到以下内容:
每个对象都有一个标识、一个类型和一个值。对象的标识在创建后不会改变;您可以将其视为对象在内存中的地址
Python的行为与C和Java类似,因为您无法重新指定指向名称的指针指向的位置。Python和Java一样,也是按值传递的,没有按引用传递的语义
看看你的第一个例子:
>>> a = 1
>>> hex(id(a))
'0x7ffdc64cd420'
>>> b = a + 1
>>> hex(id(b))
'0x7ffdc64cd440'
>>> print(a)
1
>>> print(b)
2
这里显示操作b=a+1
将a
留在1
,而b
现在是2
。这是因为int
是不可变的,指向值1
的名称将始终指向相同的地址:
>>> a = 1
>>> b = 2
>>> c = 1
>>> hex(id(a))
'0x7ffdc64cd420'
>>> hex(id(b))
'0x7ffdc64cd440'
>>> hex(id(c))
'0x7ffdc64cd420'
现在,这只适用于中的-5
到256
的值,因此除此之外,您还可以获得新地址,但上面显示的可变性仍然适用。我向您展示共享内存地址是有原因的。在同一页上,您将看到以下内容:
类型几乎影响对象行为的所有方面。甚至对象标识的重要性在某种意义上也会受到影响:对于不可变类型,计算新值的操作实际上可能返回对具有相同类型和值的任何现有对象的引用,而对于可变对象,这是不允许的。例如,a=1之后;b=1,a和b可能引用值为1的同一对象,也可能不引用,具体取决于实现,但在c=[]之后;d=[]、c和d保证引用两个不同的、唯一的、新创建的空列表。(请注意,c=d=[]将同一对象同时分配给c和d。)
所以你的例子是:
>>> a = [1, 2, 3, 4, 5]
>>> hex(id(a))
'0x17292e1cbc8'
>>> b = a
>>> hex(id(b))
'0x17292e1cbc8'
我应该可以在这里停下来,很明显a
和b
都引用了内存中地址0x17292e1cbc8
处的同一个对象。这是因为上面所说的就像是:
# Lets assume that `[1, 2, 3, 4, 5]` is 0x17292e1cbc8 in memory
>>> a = 0x17292e1cbc8
>>> b = a
>>> print(b)
'0x17292e1cbc8'
又长又瘦?您只需将指针指定给一个新名称,但两个名称都指向内存中的同一对象注意:这与a不同,因为没有生成外部复合对象。在Python中,所有东西都是一个对象。每件事都是一个地址(指针)的名称 在该页面上,您可以向下滚动并找到以下内容: 数字对象是不可变的;一旦创造了价值,它们就永远不会改变 在下面,您将看到定义的
int
类型,因此您的第二个示例非常有用
在同一页的顶部,您将看到以下内容:
每个对象都有一个标识、一个类型和一个值。对象的标识在创建后不会改变;您可以将其视为对象在内存中的地址
Python的行为与C和Java类似,因为您无法重新指定指向名称的指针指向的位置。Python和Java一样,也是按值传递的,没有按引用传递的语义
看看你的第一个例子:
>>> a = 1
>>> hex(id(a))
'0x7ffdc64cd420'
>>> b = a + 1
>>> hex(id(b))
'0x7ffdc64cd440'
>>> print(a)
1
>>> print(b)
2
这里显示操作b=a+1
将a
留在1
,而b
现在是2
。这是因为int
是不可变的,指向值1
的名称将始终指向相同的地址:
>>> a = 1
>>> b = 2
>>> c = 1
>>> hex(id(a))
'0x7ffdc64cd420'
>>> hex(id(b))
'0x7ffdc64cd440'
>>> hex(id(c))
'0x7ffdc64cd420'
现在,这只适用于中的-5
到256
的值,因此除此之外,您还可以获得新地址,但上面显示的可变性仍然适用。我向您展示共享内存地址是有原因的。在同一页上,您将看到以下内容:
类型几乎影响对象行为的所有方面。甚至对象标识的重要性在某种意义上也会受到影响:对于不可变类型,计算新值的操作实际上可能返回对具有相同类型和值的任何现有对象的引用,而对于可变对象,这是不允许的。例如,a=1之后;b=1,a和b可能引用值为1的同一对象,也可能不引用,具体取决于实现,但在c=[]之后;d=[]、c和d保证引用两个不同的、唯一的、新创建的空列表。(请注意,c=d=[]将同一对象同时分配给c和d。)
所以你的例子是:
>>> a = [1, 2, 3, 4, 5]
>>> hex(id(a))
'0x17292e1cbc8'
>>> b = a
>>> hex(id(b))
'0x17292e1cbc8'
我应该可以在这里停下来,很明显a
和b
都引用了内存中地址0x17292e1cbc8
处的同一个对象。这是因为上面所说的就像是:
# Lets assume that `[1, 2, 3, 4, 5]` is 0x17292e1cbc8 in memory
>>> a = 0x17292e1cbc8
>>> b = a
>>> print(b)
'0x17292e1cbc8'
又长又瘦?您只需将指针指定给一个新名称,但两个名称都指向内存中的同一对象注意:这与a不同,因为没有制作外部复合对象。因为
int
是一个原语,而list
不是。你能详细解释一下吗?有一天请大家通读一遍!因为int
是一个原语,而list
不是。你能详细解释一下吗?有一天请大家通读一遍!