说到多变量赋值时,先计算全部相关值,而后再从左到右依次赋值,可是这个规则不适用于python
咱们来看一例:python
package main import "fmt" func main() { data, i := [3]string{"乔帮主","慕容复","鸠摩智"}, 0 i, data[i] = 2, "枯荣大师" fmt.Println(i, data) }
输出结果:golang
2 [枯荣大师 慕容复 鸠摩智]
有的朋友会认为,结果不该该是这样么?(可是python下输出的结果倒是下面的)?bash
2 [乔帮主 慕容复 枯荣大师]
事实并如此,咱们来看赋值顺序这段的理解:函数
1 data, i := [3]string{"乔帮主","慕容复","鸠摩智"}, 0 2 i, data[i] = 2, "枯荣大师" //注意原则:先计算全部相关值,而后再从左到右依次赋值 3 // 这里变量i 的顺序实际上是(i = 0,由于上一行的变量i是0) -> (而后 i = 2), (data[i] 此时取的值是data[0],而不是data[2],也就是data[0] = 枯荣大师) 4 fmt.Println(i, data) //因此这里最终 输出 i=2,[枯荣大师 慕容复 鸠摩智]
一样的多变量赋值却不适用于python.spa
data,i=["乔帮主", "慕容复", "鸠摩智"],0 i, data[i] = 2, "枯荣大师" # 注意这里data[i] 已是 data[2]了,即data[2]="枯荣大师" print(i,data) # 输出 2 ['乔帮主', '慕容复', '枯荣大师']
另外:咱们要注意从新赋值与定义新同名变量的区别:再看一例:code
package main func main() { name := "乔帮主" println(&name) name, age := "鸠摩智", 30 // 从新赋值: 与前 name 在同层次的代码块中,且有新的变量被定义。 println(&name, age) // 一般函数多返回值 err 会被重复使用。 { name, weight := "清风扬", 50 // 定义新同名变量: 不在同层次代码块。 println(&name, weight) } }
输出:blog
0xc00002bf78 0xc00002bf78 30 0xc00002bf68 50
注意:因我的机器不一样,你们返回的内存引用地址可能和个人不同,可是 这步是重点。重点在这里:
同层级相同变量的赋值,内存地址并不会改变。不一样层级相同变量的赋值,实际上是定义了一个新同名变量,也就是你们看到的第三行内存地址变了。
接着咱们再看有点意思的一段代码(你们来找茬):内存
package main func main() { name := "乔帮主" println(&name) name, age := "鸠摩智", 30 // 从新赋值: 与前 name 在同 层次的代码块中,且有新的变量被定义。 println(&name, age) // 一般函数多返回值 err 会被重复使用。 name, weight := 100, 50 // 定义新同名变量: 不在同 层次代码块。 println(&name, weight, age) }
输出:字符串
cannot use 100 (type int) as type string in assignment
缘由很明显,由于上面:name := "乔帮主" 已经隐试滴申明了name 是字符串,等同于 var name string. 同层级再次赋值100为整形。这是不容许滴,string
可是:重点来了,咱们稍改下:
package main func main() { name := "乔帮主" println(&name) name, age := "鸠摩智", 30 // 从新赋值: 与前 name 在同 层次的代码块中,且有新的变量被定义。 println(&name, age) // 一般函数多返回值 err 会被重复使用。 { name, weight := 100, 50 // 定义新同名变量: 不在同层次代码块。 println(&name, weight, age) } }
区别就是层级发生了变化,由于{}里面的name已是新的变量了。好啦,到此介绍结束了。博友们有关golang变量使用中遇到的各类奇怪的“坑”,请留下宝贵滴足迹,欢迎拍砖留言.