我对以下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"有两种不同的方式,我想它可以说明这两种变量操作方法可能有什么不同。
答案 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
进行修改。