Python中的变量赋值和操作

时间:2015-11-03 07:24:58

标签: python variable-assignment

我对以下Python代码的结果差异非常困惑。为什么在第一种情况下" a"不会改变" b",但在第二个呢?

a=b=[]
b = [1,2,3]
print b,a
########## compare with below ################################
a=b=[]
b.append([1,2,3])
print b,a

第一部分的结果是: [1,2,3] [] 第二部分的结果是: [[1,2,3]] [[1,2,3]]

有人提出这是一个重复的问题,但我想在这里我正在更改清单" b"有两种不同的方式,我想它可以说明这两种变量操作方法可能有什么不同。

3 个答案:

答案 0 :(得分:2)

因为=append不同。

执行b = [1, 2, 3]后,您可以为b分配新值。这不以任何方式涉及b的旧值;无论之前持有什么价值b,你都可以做到这一点。

执行b.append(...)时,您修改作为b现有值的对象。如果该对象也是其他名称的值(在这种情况下,a),那么这些名称也将"参见"改变。请注意,与赋值不同,这些类型的操作取决于您拥有的值类型。您可以执行b.append(...),因为b是一个列表。如果b是一个整数,则无法执行b.append,但您仍然可以执行b = [1, 2, 3]

答案 1 :(得分:2)

在第一个示例中,您将重新分配变量 [WebMethod] public void Insert(string name, string description, int companyName, int projectStatus, string websiteurl, string completedin, string startredin, int status) { cmd = con.CreateCommand(); con.Open(); //cmd.CommandText = "CMPPROJECTPROC"; cmd = new OracleCommand("CMPPROJECTPROC", con); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("p_projectname", OracleDbType.Varchar2).Value = name; cmd.Parameters.Add("p_description", OracleDbType.Varchar2).Value = description; cmd.Parameters.Add("p_company", OracleDbType.Int16).Value = companyName; cmd.Parameters.Add("p_projectstatus", OracleDbType.Int16).Value = projectStatus; cmd.Parameters.Add("p_websiteurl", OracleDbType.Varchar2).Value = websiteurl; cmd.Parameters.Add("p_completedin", OracleDbType.Varchar2).Value = completedin; cmd.Parameters.Add("p_startedin", OracleDbType.Varchar2).Value = startredin; cmd.Parameters.Add("p_status", OracleDbType.Int16).Value = status; cmd.ExecuteNonQuery(); con.Close(); } ,现在它指向另一个列表。

b

在第二个示例中,a = b = [] # a -> [] <- b b = [1, 2, 3] # a -> [], b -> [1, 2, 3] a变量都指向同一个列表,并且您在列表中插入值:

b

答案 2 :(得分:1)

要详细说明其他答案,这可以直接来自Python docs

list.append(x)
    Add an item to the end of the list; equivalent to a[len(a):] = [x].

看着:

a[len(a):] = [x]

很容易看出使用append正在修改原始列表(python示例代码中的a,在您的情况下为b)。

正如其他人所指出的那样,使用赋值语句会为b分配一个新值,而不是通过append进行修改。