【问题标题】:Python: call a method of an object, when will the object will be changed and when will not?Python:调用对象的方法,对象什么时候会改变,什么时候不会?
【发布时间】:2016-10-29 15:19:59
【问题描述】:

我是python新手,我只是发现了一些奇怪的东西:

>>> test="acdefg"
>>> test.replace('a','h')
'hcdefg'
>>> test
'acdefg'
>>> test=[1,2,3]
>>> test.reverse()
>>> test
[3, 2, 1]

如你在代码中看到的,第一次,变量“test”是一个字符串,当我调用方法“replace”时,“test”的值没有改变,第二次是一个列表,并且在我调用方法 reverse() 后列表发生了变化。

那是为什么?是因为方法之间的不同还是对象之间的不同或其他原因?

【问题讨论】:

  • Python 字符串是不可变的。列表不是。
  • 那么它是关于对象的属性或方法的属性或两者兼而有之?
  • @Statham 你看我的回答了吗?它回答了这个问题。
  • 对象的属性决定了方法的实现。这只是通常需要阅读文档或尝试小示例来确定行为的事情之一
  • @idjaw 是的,我已经读过了,现在我知道了。 “不可变”对我来说有点奇怪,因为我首先学习了 C,其中任何东西都可以通过简单的分配来改变。但现在我确定我不应该假定 Python 具有与 C 相同的属性:p

标签: python function methods


【解决方案1】:

字符串是不可变的。所以你实际上并没有改变test。您实际上得到了 returnreplace 字符串方法。要使用这个修改后的字符串,您必须创建一个新字符串,或者简单地将现有字符串替换为新值。

>>> some_string = "abcd"
>>> new_string = some_string.replace('a', 'x')
>>> new_string
xbcd

>>> some_string = "abcd"
>>> some_string = some_string.replace('a', 'x')
>>> some_string
xbcd

第二个例子,列表是可变的,你正在对列表执行就地操作。如果你真的这样做:

res = your_list.reverse()

res 实际上是None,因为它不返回任何内容,它实际上是在原地执行,这就是为什么test list 将保存您执行的新操作。

阅读this 了解 Python 中的不可变与可变类型。

另外,请参阅有关数据模型的文档here 以进一步了解。

【讨论】:

  • 我只记得Java中的一些东西,当我想修改一个字符串时,我一直使用a=a.replace(..........)
  • @Statham 不要尝试像使用另一种语言一样使用一种语言。您必须参考文档并了解您使用的语言的实际行为方式。它的方法如何工作以及如何在语言中处理不同的数据类型。认为语言 A 的行为应该与语言 B 完全一样是一个很大的错误。
【解决方案2】:

这完全取决于方法的实现。有些方法会修改它们被调用的对象,有些则不会。

【讨论】:

  • 那么当我使用新方法时,如何知道该方法是否修改了对象?通过阅读源代码?对于一个新学习者来说似乎有点困难:(
  • @Statham 要么,或者更简单地说,阅读文档。
  • 有人评论说“Python字符串是不可变的。列表不是。”,我认为他在谈论对象的属性,而您说这完全取决于方法。我可以说你从不同的角度谈论同一件事吗?
  • 这样想。 string 方法通常会返回一些东西,因为字符串是不可变的,所以你不能执行就地操作。列表操作通常会返回 None,因为它们是可变的,因此可以就地完成。
  • @Statham 没错。这是另一个将提供更多详细信息的答案:stackoverflow.com/a/9098038/1832539
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多