Python为什么我必须重新分配给变量

时间:2019-04-27 19:52:43

标签: python python-3.x

我正在清理数据。在下面的代码中,我使用str.title函数将单词大写。然后,我检查它们是否为空,如果是,我写点东西。但是然后我必须将行分配回一个变量,但是对此我有些困惑。

for row in moma:
    gender = row[5]

    #capitalize gender column
    gender = gender.title()

    #check to see if column is empty
    if not gender:
        gender = 'Gender Unknown/Other'
    row[5] = gender 

for row in moma:
    Nationality = row[2]

    Nationality = Nationality.title()

    if not Nationality:
        Nationality = 'Nationality Unknown'
    row[2] = Nationality

示例数据:

['Duplicate of plate from folio 11 verso (supplementary suite, plate 4) from ARDICIA', 'Pablo Palazuelo', 'Spanish', '(1916)', '(2007)', 'Male', '1978', 'Prints & Illustrated Books']
['Tailpiece (page 55) from SAGESSE', 'Maurice Denis', 'French', '(1870)', '(1943)', 'Male', '1889-1911', 'Prints & Illustrated Books']

3 个答案:

答案 0 :(得分:1)

由于生成的值是一个单独的对象,因此必须重新分配到该行。您必须使用对象更新该行才能影响该行。

您提供的代码看起来可以正常工作,但是可以简化。无需对行进行两次迭代,例如:

moma = [['w','x','male','y','z',''],
        ['w','x','','y','z','French']]

for row in moma:
    row[2] = row[2].title() if row[2] else 'Gender Unknown/Other'
    row[5] = row[5].title() if row[5] else 'Nationality Unknown'
    print(row)

输出:

['w', 'x', 'Male', 'y', 'z', 'Nationality Unknown']
['w', 'x', 'Gender Unknown/Other', 'y', 'z', 'French']

答案 1 :(得分:0)

python具有可变对象(如列表或字典)和不可变对象(如string或int)。 可变对象总是按引用分配。这意味着对副本的更改会影响原始值。另一方面,不可变对象在分配给另一个变量后会被深深复制,因此机会仅会影响复制的版本。

编辑:我错了。 Python从不复制作业。

  

Python中的Assignment语句不复制对象,它们在目标和对象之间创建绑定。   https://docs.python.org/3/library/copy.html

答案 2 :(得分:0)

您的问题分为两部分:

im cleaning data. In the code below, I am using the str.title function to capitalize words. Then I check to see if they are empty, and if so I write something. But then I have to assign the row back to a variable, but I am a bit confused on that.
  

为什么我必须重新分配给变量

在您的代码中,编写以下内容:

gender = gender.title()

还有以下内容:

if not gender:
    gender = 'Gender Unknown/Other'

模式a = do something with a背后的原因是Python中的字符串是不可变的,这意味着您无法修改它们。当您执行gender = f(gender)时,您会将f(gender)的结果分配给名称“性别”,从而删除了以前存在的所有定义。

顺便说一句,在Python中,您可以为名称分配值。文档中几乎没有提到“变量”的概念。都是关于名字的。

因此,在代码的后面,您编写了row[5] = gender。之所以需要这样做,还因为字符串是不可变的:您无法在不为其分配其他任何内容的情况下更改该行。

现在,如果该行是其他内容(例如对象),则可以执行类似row[5].content = 'blah'的操作。

相关问题