应用于变量的方法与应用于列表的方法

-2 投票
3 回答
53 浏览
提问于 2025-04-14 17:48

我刚开始学习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(),这个新变量是把旧变量 nameupper() 方法处理过后的结果,然后我把它打印出来。但是在第二段代码中,我没有定义新变量,而是直接对列表 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 个回答

0

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,那么这个函数很可能是修改了它的对象。

1

在你提供的第一段代码中:

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

2

你已经了解了一个叫做不可变性的概念。

字符串是不可变的

在Python中,字符串是不能被改变的。你只能基于一个旧的字符串创建一个新的字符串。例如,name.upper()会生成一个新的字符串,里面的字母和原来的字符串一样,但都是大写的。它不会(也不能)改变原来的name字符串。

这就是为什么你必须这样做:

new_name = name.upper()

new_name是新创建的字符串,而name依然是原来的字符串。

列表是可变的

你可以在不创建新列表的情况下编辑一个已有的列表。我们可以直接在原来的列表上添加、删除或更新元素(这样就修改了这个列表)。

例如:

numbers.append(5)

这会在已有的列表中添加一个新元素,而不会创建一个新列表。如果你想创建一个新列表(而不更新原来的),你可以选择先复制一份:

new_numbers = numbers.copy()
new_numbers.append(5)

撰写回答