应用于变量的方法与应用于列表的方法
我刚开始学习Python,才几天,所以对很多东西还不太明白。
我有点困惑,希望能帮我理清思路。
来看下面这两段代码:
name = "My name is John."
print(name)
new_name=name.upper()
print(new_name)
还有
numbers = ["A","B","C"]
print(numbers)
numbers.remove("A")
print(numbers)
在第一段代码中,我们定义了一个新变量 new_name = name.upper()
,这个新变量是把旧变量 name
用 upper()
方法处理过后的结果,然后我把它打印出来。但是在第二段代码中,我没有定义新变量,而是直接对列表 numbers
使用 remove()
方法,然后打印出来。
不过,如果我试着这样修改我的第一段代码:
name = "My name is John."
print(name)
name.upper()
print(name)
结果就不会如我所愿。第二段代码也是如此:
numbers = ["A","B","C"]
print(numbers)
new_numbers = numbers.remove("A")
print(new_numbers)
也许我问的问题很简单,但我对这两段代码之间的不一致感到好奇。谢谢你们。
这是我学习Python的第二天,我试着弄明白我的问题,但找不到答案。如果有人能告诉我问题出在哪里,我会非常感激。
3 个回答
name.upper()
这个方法不会改变 name
这个变量的值,它只是返回一个新的字符串,这个新字符串会被赋值给原来的名字。
>>> name = "foo"
>>> name.upper()
'FOO'
>>> name
'foo'
而 numbers.remove("A")
则会直接修改 numbers
这个列表,它不会创建一个新的列表,只是把原来的列表中的 "A"
删除掉。这个方法不会返回列表,而是返回 None
,所以你不需要把 None
赋值回去。
>>> numbers = [1,2,3]
>>> numbers.remove(1)
>>> numbers
[2, 3]
(当返回的值是单独的 None
时,交互式解释器不会输出任何东西。)
一般来说,你只需要查看文档,看看一个方法是会改变它所操作的对象,还是返回一个新的值。作为一个简单的规则,如果你期待某个函数返回一个值,但它却返回了 None
,那么这个函数很可能是修改了它的对象。
在你提供的第一段代码中:
name = "My name is John."
print(name)
new_name=name.upper()
print(new_name)
name
是一个字符串类型的变量。它有一个叫做 .upper()
的方法,这个方法会返回一个新的字符串,里面的所有字母都是大写的。所以,这个新字符串被赋值给了一个新变量 new_name
,也就是说,new_name
就是 name
的大写版本。需要注意的是,.upper()
这个方法不会改变原来的变量值,也就是说,调用这个方法的变量(在这里是 name
)的值还是保持不变。我们只关心它返回的新值。
你可以在这里查看 str.upper()
的详细信息: https://docs.python.org/3/library/stdtypes.html#str.upper
在你提供的第二段代码中:
numbers = ["A","B","C"]
print(numbers)
numbers.remove("A")
print(numbers)
变量 numbers
是一个列表类型。它有一个叫做 .remove()
的方法,这个方法会删除列表中第一个与提供的参数相等的元素。这就是 .remove()
的副作用。不过,它不会返回任何值,所以把 .remove()
的结果赋值给某个变量是没有意义的。
你可以在这里查看 Python 中 list
的方法: https://docs.python.org/3/tutorial/datastructures.html
你已经了解了一个叫做不可变性的概念。
字符串是不可变的
在Python中,字符串是不能被改变的。你只能基于一个旧的字符串创建一个新的字符串。例如,name.upper()
会生成一个新的字符串,里面的字母和原来的字符串一样,但都是大写的。它不会(也不能)改变原来的name
字符串。
这就是为什么你必须这样做:
new_name = name.upper()
new_name
是新创建的字符串,而name
依然是原来的字符串。
列表是可变的
你可以在不创建新列表的情况下编辑一个已有的列表。我们可以直接在原来的列表上添加、删除或更新元素(这样就修改了这个列表)。
例如:
numbers.append(5)
这会在已有的列表中添加一个新元素,而不会创建一个新列表。如果你想创建一个新列表(而不更新原来的),你可以选择先复制一份:
new_numbers = numbers.copy()
new_numbers.append(5)