python为何有的方法在print时就会作用在变量上?

新手上路,请多包涵

对于upper()这样的方法,如果在print时使用,并不会真正应用到变量上:

name = 'Luke'
print(name.upper())
print(name)

LUKE
Luke

但对于pop()和remove(),在print时就会实际作用在列表上,为什么呢?

motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles.pop())
print(motorcycles)

suzuki
['honda', 'yamaha']

刚开始入门,感谢回答。

阅读 3.1k
3 个回答

如果你入门还没了解到对象 class,那就先去了解对象,否则下面你也看不懂。

python里,一切都是对象,print只是调用了对象的__str__的方法。
list.pop()方法改变了对象属性,而str.upper()没有,大致逻辑如下

class str(object):
    def __init__(self, raw):
        self.raw = raw
        
    def __str__(self):
        return self.raw
        
    def upper(self):
        return "".join([chr(ord(c) + 29) for c in self.raw])
        
class list(object):
    def __init__(self, raw):
        self.raw = raw
        
    def __str__(self):
        return self.raw
        
    def pop(self, index=None):
        if index is None:
            index = len(self.raw) - 1
        to_pop = self.raw[index]
        self.raw = self.raw[:index] + self.raw[index + 1:]  # 注意这里self.raw已经改变了, pop前后调用__str__返回值不同

题主问的问题最常见的一个例子就是:sort()和sorted的区别。

clipboard.png

sort()是列表的方法。sort对列表本身的元素进行修改变化。

sorted()是内置函数,不是列表的方法,适用于各种可迭代对象。
它返回的是新的排序对象,不作用于原来对象。

num str unicode tuple bytearray frozenset 这些类型是不可变对象immutable,在调用相关方法后返回的是一份硬拷贝,所以原来的值不会变。

此外,如list dict等是可变对象,在调用方法后一般会改变其自身的值,如l.pop(),但也有一些会返回硬拷贝值的方法,具体可参考文档,如l[:]返回的是该列表的硬拷贝。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题