Heim  >  Fragen und Antworten  >  Hauptteil

内存 - Python list内容的改变问题

Pyhton 新手。
今天看教程的时候实验了如下代码:

old = 'abc'
old.replace('a','A')
print old

这里old 并没有被替换,这个我可以理解,因为replace方法返回了一个新的对象,old仍指向原对象。
所以打印的仍然是abc

替换成:

old = 'abc'
new = old.replace('a','A')
print new

即可。
结果就是Abc了。

但是,又想到了这个问题,代码如下:

stu1 = 'Tom'
stu2 = 'John'

classMates = [stu1,stu2]

print classMates

stu2 = 'Marry'

print classMates

结果却是:
['Tom','John']
['Tom','John']

而不是预期的:
['Tom','John']
['Tom','Marry']

如果再对list赋值一次:

classMates = [stu1,stu2]

就可以得到想要的效果。

所以想问的是list创建的时候指向的是stu1和stu2的位置么,为什么stu2中的内容变了list中的不会变呢?
还是像最开始的那个例子一样,产生了一个新的list?现在的classMates没有指向更改后的list而是还是指向原来的list?

谢谢!

怪我咯怪我咯2762 Tage vor263

Antworte allen(3)Ich werde antworten

  • 巴扎黑

    巴扎黑2017-04-17 15:48:44

    你要知道 Python 里的赋值操作的意义是什么:

    最简单的赋值,如 a = b,是将 b 所指称的对象与名字 a 关联起来,这样你就可以用名字 a 来指称这个对象了。

    所以,你的代码的意思是:

    stu1 = 'Tom'             # 我把 'Tom' 这个字符串叫作 stu1
    stu2 = 'John'            # 我把 'John' 这个字符串叫作 stu2
    
    classMates = [stu1,stu2] # 我把列表叫作 classMates。在这里,名字的意义被表达,所以 classMates 是 ['Tom', 'John']
    
    print classMates
    
    stu2 = 'Marry'           # 我把 'Marry' 这个字符串叫作 stu2。之前这个名字属于另一个对象,但从此刻起它属于 'Marry' 了
    
    print classMates         # classMates 就是 ['Tom', 'John'] 啊

    stu2 中没有内容,它只是名字。名字可以指称一个对象。

    理解而不是记忆!Python 不是 C!更不是 C++!

    忘记了贴一个相关的回复。

    Antwort
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 15:48:44

    stu1 = 'Tom'
    stu2 = 'John'

    这两句创建了两个字符串对象:'Tom' 和 'John' 并将这两个对象的引用赋值给 stu1 跟 stu2。

    classMates = [stu1,stu2]

    两个字符串对象成为了list的元素 引用计数分别+1,就是2

    stu2 = 'Marry'

    'John'的引用计数-1 'Marry'引用计数+1

    Antwort
    0
  • 高洛峰

    高洛峰2017-04-17 15:48:44

    list     = [1,2,3]
    list2    =  list
    list2[0] = 100
    print list
    
    a = 1
    b = a
    b = 2
    print a

    记住list和变量的区别。list是引用的。list 和list2 指向的都是同一个地址
    变量不是引用的。

    Antwort
    0
  • StornierenAntwort