精华内容
下载资源
问答
  • Python是动态类型语言,也就是说需要预先声明变量类型,变量类型和值在赋值那一刻被初始化,下面详细介绍了Python变量赋值问题,一起来学习学习吧。我们先看一下如下代码:c = {}def foo():f = dict(zip(list(&...

    前言

    在Python中变量名规则与其他大多数高级语言一样,都是受C语言影响的,另外变量名是大小写敏感的。

    Python是动态类型语言,也就是说不需要预先声明变量类型,变量的类型和值在赋值那一刻被初始化,下面详细介绍了Python的变量赋值问题,一起来学习学习吧。

    我们先看一下如下代码:

    c = {}

    def foo():

    f = dict(zip(list("abcd"), [1, 2 ,3 ,4]))

    c.update(f)

    if __name__ == "__main__":

    a = b = d = c

    b["e"] = 5

    d["f"] = 6

    foo()

    print(a)

    print(b)

    print(c)

    print(d)

    输出结果:

    {"a": 1, "c": 3, "b": 2, "e": 5, "d": 4, "f": 6}

    {"a": 1, "c": 3, "b": 2, "e": 5, "d": 4, "f": 6}

    {"a": 1, "c": 3, "b": 2, "e": 5, "d": 4, "f": 6}

    {"a": 1, "c": 3, "b": 2, "e": 5, "d": 4, "f": 6}

    如果你对以上输出结果不感到奇怪,那么就不必往下看了。实际上本文要讨论的内容非常简单,不要为此浪费您宝贵的时间。

    Python 属于动态语言,程序的结构可以在运行的过程中随时改变,而且 python 还是弱类型的语言,所以如果你是从静态、强类型编程语言转过来的,理解起 Python 的赋值,刚开始可能会感觉有些代码有点莫名其妙。

    可能你会以为上面代码的输出会是这样的:

    {}

    {"e": 5}

    {}

    {"f": 6}

    你可能认为 a 没有被改变,因为没有看到哪里对它做了改变;b 和 d 的改变是和明显的;c 呢,因为是在函数内被改变的,你可能认为 c 会是一个局部变量,所以全局的 c 不会被改变。

    实际上,这里的 a, b, c, d 同时指向了一块内存空间,这可内存空间保存的是一个字典对象。这有点像 c 语言的指针,a, b, c, d 四个指针指向同一个内存地址,也就是给这块内存其了 4 个笔名。所以,不管你改变谁,其他三个变量都会跟着变化。那为什么 c 在函数内部被改变,而且没有用 global 申明,但全局的 c 去被改变了呢?

    我们再来看一个例子:

    >>>a = {1:1, 2:2}

    >>>b = a

    >>>a[3] = 3

    >>>b

    {1: 1, 2: 2, 3: 3}

    >>>a = 4

    >>>b

    {1: 1, 2: 2, 3: 3}

    >>>a

    4

    当 b = a 时,a 与 b 指向同一个对象,所以在 a 中添加一个元素时,b 也发生变化。而当 a = 4 时, a 就已经不再指向字典对象了,而是指向一个新的 int 对象(python 中整数也是对象),这时只有 b 指向字典,所以 a 改变时 b 没有跟着变化。这是只是说明了什么时候赋值变量会发生质的改变,而以上的问题还没有被解决。

    那么,我么再来看一个例子:

    class TestObj(object):

    pass

    x = TestObj()

    x.x = 8

    d = {"a": 1, "b": 2, "g": x}

    xx = d.get("g", None)

    xx.x = 10

    print("x.x:%s" % x.x)

    print("xx.x: %s" % xx.x)

    print("d["g"].x: %s" % d["g"].x)

    # Out:

    # x.x:10

    # xx.x: 10

    # d["g"].x: 10

    由以上的实例可以了解到,如果仅改变对象的属性(或者说成是改变结构),所有指向该对象的变量都会随之改变。但是如果一个变量重新指向了一个对象,那么其他指向该对象的变量不会随之变化。所以,最开始的例子中,c 虽然在函数内部被改变,但是 c 是全局的变量,我们只是在 c 所指向的内存中添加了一个值,而没有将 c 指向另外的变量。

    需要注意的是,有人可能会认为上例中的最后一个输出应该是 d["g"].x: 8。 这样理解的原因可能是觉得已经把字典中 "g" 所对应的值取出来了,并重新命名为 xx,那么 xx 就与字典无关了。其实际并不是这样的,字典中的 key 所对应的 value 就像是一个指针指向了一片内存区域,访问字典中 key 时就是去该区域取值,如果将值取出来赋值给另外一个变量,例如 xx = d["g"] 或者 xx = d.get("g", None),这样只是让 xx 这个变量也指向了该区域,也就是说字典中的键 "g" 和 xx 对象指向了同一片内存空间,当我们只改变 xx 的属性时,字典也会发生变化。

    下例更加直观的展示了这一点:

    class TestObj(object):

    pass

    x = TestObj()

    x.x = 8

    d = {"a": 1, "b": 2, "g": x}

    print(d["g"].x)

    xx = d["g"]

    xx.x = 10

    print(d["g"].x)

    xx = 20

    print(d["g"].x)

    # Out:

    # 8

    # 10

    # 10

    这个知识点非常简单,但如果没有理解,可能无法看明白别人的代码。这一点有时候会给程序设计带来很大的便利,例如设计一个在整个程序中保存状态的上下文:

    class Context(object):

    pass

    def foo(context):

    context.a = 10

    context.b = 20

    x = 1

    def hoo(context):

    context.c = 30

    context.d = 40

    x = 1

    if __name__ == "__main__":

    context = Context()

    x = None

    foo(context)

    hoo(context)

    print(x)

    print(context.a)

    print(context.b)

    print(context.c)

    print(context.d)

    # Out:

    # None

    # 10

    # 20

    # 30

    # 40

    示例中我们可以把需要保存的状态添加到 context 中,这样在整个程序的运行过程中这些状态能够被任何位置被使用。

    在来一个终结的例子,执行外部代码:

    outer_code.py

    from __future__ import print_function

    def initialize(context):

    g.a = 333

    g.b = 666

    context.x = 888

    def handle_data(context, data):

    g.c = g.a + g.b + context.x + context.y

    a = np.array([1, 2, 3, 4, 5, 6])

    print("outer space: a is %s" % a)

    print("outer space: context is %s" % context)

    main_exec.py

    from __future__ import print_function

    import sys

    import imp

    from pprint import pprint

    class Context(object):

    pass

    class PersistentState(object):

    pass

    # Script starts from here

    if __name__ == "__main__":

    outer_code_moudle = imp.new_module("outer_code")

    outer_code_moudle.__file__ = "outer_code.py"

    sys.modules["outer_code"] = outer_code_moudle

    outer_code_scope = code_scope = outer_code_moudle.__dict__

    head_code = "import numpy as np from main_exec import PersistentState g=PersistentState()"

    exec(head_code, code_scope)

    origin_global_names = set(code_scope.keys())

    with open("outer_code.py", "rb") as f:

    outer_code = f.read()

    import __future__

    code_obj = compile(outer_code, "outer_code.py", "exec", flags=__future__.unicode_literals.compiler_flag)

    exec(code_obj, code_scope)

    # 去除掉内建名字空间的属性,仅保留外部代码中添加的属性

    outer_code_global_names = set(outer_code_scope.keys()) - origin_global_names

    outer_func_initialize = code_scope.get("initialize", None)

    outer_func_handle_data = code_scope.get("handle_data", None)

    context = Context()

    context.y = 999

    outer_func_initialize(context)

    outer_func_handle_data(context, None)

    g = outer_code_scope["g"]

    assert g.c == 2886

    print("g.c: %s" % g.c)

    print(dir(g))

    print(dir(context))

    pprint(outer_code_moudle.__dict__)

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

    展开全文
  • 其一般的形式为:变量名=表达式例如 :a=12、a=b+c、a=sqrt(7)等在C语言程序里是合法的,但“=”左边为表达式,“=”右边为变量名只是被编译器所允许的表达式。注意:C语言中,赋值运算的操作是有方向的,即将右侧...

    一、赋值

    1.赋值运算符含义是将一个数据赋值给一个变量。其一般的形式为:变量名=表达式

    例如 :a=12、a=b+c、a=sqrt(7)等在C语言程序里是合法的,但“=”左边为表达式,“=”右边为变量名只是不被编译器所允许的表达式。

    注意:C语言中,赋值运算的操作是有方向的,即将右侧表达式的值(也称为右值)赋值左侧的变量,只能是标识一个特定存储单元的变量名。

    由于变量名只能出现在赋值运算符的左边,因此它也被称为左值;由于常量只能出现在赋值运算符的右边,因此它也被称为右值。左值可以用作右值,但右值不能用作左值。

    赋值运算符的优先级低于算术运算符、关系运算符以及逻辑运算符。由于赋值表达式的值被规定为运算完成后操作数的值,类型与左操作数相同,且赋值运算符的结合性为右结合,因此,C语言还允许这样的赋值形式:

    变量1=变量2=变量3=……=变量n=表达式

    这种形式称为多重赋值表达式,一般用于多个变量赋予同一个值。由于赋值运算符是右结合,因此执行是把表达式值依次赋给变量n,……,变量1,即上面的形式等价于

    变量1=(变量2=(变量3+(……=(变量n=表达式)……)))

    2.复合的赋值运算符,其形式如下:

    变量 二元运算符=表达式等价于变量=变量 二元运算符 表达式

    涉及算数的复合运算符,即+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=。这种形式更直观,执行效率更高些。

    小贴士:将赋值表达式n*=m+4按照n=n*m+2来运算是错误的,事实上应按n=n*(m+2)来运算。

    二、C语句的分类

    53838531adbc628529623051fbc55abd.png

    1.控制语句。C语言只有9种控制语:

    if~elsefor()~continue

    switchwhile~goto

    breakdo~whilereturn

    2.变量定义语句。由类型关键字后变量名,如“int a,b,c;”。值得注意的是,变量定义语句不是可执行语句。它只是将某些信息传递给编译器,通知编译器变量的类型是什么,以便编译器为其预留出相应的大小存储空间,因为不同类型的变量在内存中占据的存储空间大小不同。

    3.表达式语句。由表达式后接一个分号构成的语句。

    4.函数调用语句。表达式必须是有值的,而函数调用不一定是用返回值。在C语言中,没有专门的输入和输出语句,输入和输出操作通常通过调用输入和输出函数实现。

    5.复合语句。两条或两条以上的语句序列,用一对花括号括起来构成的语句。

    6.空语句。只有一个分号构成的语句,表示什么也不做,过渡作用。

    二、表达式语句

    顺序结构是最简单的程序结构。在顺序结构程序中,程序的执行是按照语句书写的顺序来完成,赋值操作是顺序结构中最常见的操作。在C语言中,没有专门的赋值语句赋值操作通常使用赋值表达式后接一个分号(;)构成赋值表达式语句实现。例如“C=100;”这是一个赋值语句表达式。

    1.复合语句

    两条或两条以上语句序列,用一对花括号括起来构成的语句,称为复合语句,也叫语句块,其形式:

    {

    语句一;

    语句二;

    语句N;

    }

    例如

    {

    a++;

    t=a*2;

    y--;

    }

    在逻辑上形成一个整体,在语法上等同于一条语句,可被当作一条语句来处理,这样就为程序设计带来便利。

    2.空语句

    在表达语句中,如果没有任何表达式而只是一个分号,则称为空语句,其形式如

    ; //空语句

    自动跳过,不起任何作用。

    展开全文
  • 其一般的形式为:变量名=表达式例如 :a=12、a=b+c、a=sqrt(7)等在C语言程序里是合法的,但“=”左边为表达式,“=”右边为变量名只是被编译器所允许的表达式。注意:C语言中,赋值运算的操作是有方向的,即将右侧...

    一、赋值

    1.赋值运算符含义是将一个数据赋值给一个变量。其一般的形式为:变量名=表达式

    例如 :a=12、a=b+c、a=sqrt(7)等在C语言程序里是合法的,但“=”左边为表达式,“=”右边为变量名只是不被编译器所允许的表达式。

    注意:C语言中,赋值运算的操作是有方向的,即将右侧表达式的值(也称为右值)赋值左侧的变量,只能是标识一个特定存储单元的变量名。

    由于变量名只能出现在赋值运算符的左边,因此它也被称为左值;由于常量只能出现在赋值运算符的右边,因此它也被称为右值。左值可以用作右值,但右值不能用作左值。

    赋值运算符的优先级低于算术运算符、关系运算符以及逻辑运算符。由于赋值表达式的值被规定为运算完成后操作数的值,类型与左操作数相同,且赋值运算符的结合性为右结合,因此,C语言还允许这样的赋值形式:

    变量1=变量2=变量3=……=变量n=表达式

    这种形式称为多重赋值表达式,一般用于多个变量赋予同一个值。由于赋值运算符是右结合,因此执行是把表达式值依次赋给变量n,……,变量1,即上面的形式等价于

    变量1=(变量2=(变量3+(……=(变量n=表达式)……)))

    2.复合的赋值运算符,其形式如下:

    变量 二元运算符=表达式等价于变量=变量 二元运算符 表达式

    涉及算数的复合运算符,即+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=。这种形式更直观,执行效率更高些。

    小贴士:将赋值表达式n*=m+4按照n=n*m+2来运算是错误的,事实上应按n=n*(m+2)来运算。

    二、C语句的分类

    f4cf3e738007959730ce3cb66b72ce50.png

    1.控制语句。C语言只有9种控制语:

    if~elsefor()~continue

    switchwhile~goto

    breakdo~whilereturn

    2.变量定义语句。由类型关键字后变量名,如“int a,b,c;”。值得注意的是,变量定义语句不是可执行语句。它只是将某些信息传递给编译器,通知编译器变量的类型是什么,以便编译器为其预留出相应的大小存储空间,因为不同类型的变量在内存中占据的存储空间大小不同。

    3.表达式语句。由表达式后接一个分号构成的语句。

    4.函数调用语句。表达式必须是有值的,而函数调用不一定是用返回值。在C语言中,没有专门的输入和输出语句,输入和输出操作通常通过调用输入和输出函数实现。

    5.复合语句。两条或两条以上的语句序列,用一对花括号括起来构成的语句。

    6.空语句。只有一个分号构成的语句,表示什么也不做,过渡作用。

    二、表达式语句

    顺序结构是最简单的程序结构。在顺序结构程序中,程序的执行是按照语句书写的顺序来完成,赋值操作是顺序结构中最常见的操作。在C语言中,没有专门的赋值语句赋值操作通常使用赋值表达式后接一个分号(;)构成赋值表达式语句实现。例如“C=100;”这是一个赋值语句表达式。

    1.复合语句

    两条或两条以上语句序列,用一对花括号括起来构成的语句,称为复合语句,也叫语句块,其形式:

    {

    语句一;

    语句二;

    语句N;

    }

    例如

    {

    a++;

    t=a*2;

    y--;

    }

    在逻辑上形成一个整体,在语法上等同于一条语句,可被当作一条语句来处理,这样就为程序设计带来便利。

    2.空语句

    在表达语句中,如果没有任何表达式而只是一个分号,则称为空语句,其形式如

    ; //空语句

    自动跳过,不起任何作用。

    展开全文
  • 语句C语言的灵魂

    2018-01-27 16:40:12
    空语句,顾名思义就是执行任何操作的语句,但是它在C语言里面是一条合法的语句,本身只包含一个分号。 2。赋值语句 赋值语句是在表达式里面完成的,任何的表达式,后面只要加上一个分号,就可以变成语句。赋值...

    要想实现C语言,那就必须依靠语句。只有把语句组合起来才可以构成可执行的程序,那么今天我就把学到的关于语句的知识分享给大家。

    1.空语句

    空语句,顾名思义就是不执行任何操作的语句,但是它在C语言里面是一条合法的语句,本身只包含一个分号。

    2。赋值语句

    赋值语句是在表达式里面完成的,任何的表达式,后面只要加上一个分号,就可以变成语句。赋值语句常用的操作符包括 “+ -*/"这四种。现在在C语言里面,没有专门的赋值语言,这些语句是为了适应代码才会写成语句的,便于程序猿操作

    3.if else语句

    if else语句属于条件语句,条件为真则执行if后面的语句,条件为假执行else后面的语句。if else语句和三目运算符的条件操作符具有想通之处。但是使用这个语句需要注意的一点:if else必须配套使用,也可以单独使用if,但是最好加上一个{}来分离开来,避免出现不必要的错误。还有一点就是else和最近的if匹配。

    4.while语句

    while 语句的主要特点是为真就执行,为假就跳出循环,这点和for循环语句很相似。但是,while语句具有for循环语句所不具有的优点。比如说,在一个for循环中,条件的初始值,循环控制变量还有判断条件都在一起,这样很方便观察,而while语句就需要分成三条语句,着实不好判断。

    很简单的举个栗子

    for(i=0;i<10;i++)
    arr[i]=0;
    //上面的for循环就更加的简洁
    i=0;
    while(i<10)
    {
    	arr[i]=0;
    	i+=1

    5.break语句和continue语句

    其上的两个语句都具有终止循环的作用,但是在使用上还是有些许的差别。break语句一旦执行,便会永久的终止循环,而continue只会跳出当前循环,然后执行下一次循环,直到不满足循环条件时跳出整个循环,我在下面插入一个图片进行一下两者的比较,方便你们更好的理解(画的图有些看不下去,凑活看吧我也很不好意思啊)

    上传不上啊,可能网速太慢了,各位,我今晚上给你们上传啦



    6.do语句

    do语句使用和while语句类似,不过需要注意的是,do语句会先执行再判断条件是否满足,所以do语句至少会执行一次,而while语句如果初始条件不满足的话,那就一次也不执行。如果循环的条件相同,那么不管是do语句还是while语句,他们循环的次数是一样多的。

    7.switch()语句

    switch语句适用于执行多个条件语句时的判断,switch语句通常会和case语句连用。在使用switch语句时需要注意,()内必须是整型数据,否则会报错,当然也可以是表达式,但数据类型必须是整型。()内的初始值是多少,就执行对应的case语句。如果在case语句后面不跟上break,那么程序会贯穿多个case,这可能不是你想要的结果,那么就要记得在合适的地方加上break,以免程序报错。如果输入的初始值不满足任何一个case,那就需要用到default语句了,这个语句负责提醒输入错误。


    展开全文
  • ”就是一个合法的语句,没有语法错误,这种在恰当位置添加的“;”是无法通过编译器检查出来的。C语言常用语句分类如下图:表达式后面加上“;”就是表达式语句,比如:a=a*10; 就是赋值表达式语句。在函数调用...
  • C语言基础

    2020-09-14 11:17:30
    文章结构: 赋值定义运算语句 格式化输入输出语句 符号常量:#define 标识符 常量值 两种 while 语句 && switch语句 数组 && 字符串 ...注:部分内容省略了,适用于学过C语言或其他语言的...是不合法的
  • 你必须知道495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    这为什么是合法的C语言表达式呢? 数组的指针 6.12 既然数组引用会退化为指针,如果array是数组,那么array和&array又有什么区别呢? 6.13 如何声明一个数组的指针? 动态数组分配 6.14 如何在运行时设定...
  • 若变量均已正确定义并赋值,以下合法的C语言赋值语句是( )。 A、x+n=I; B、x==5; C、x=n/2.5; D、5=x=4+1; C 用scanf函数输入数据,使得x=9.6,y=81.73选择正确的输入语句( ). A、scanf("x=?",x); scanf("y=_",&y);...
  • C语言习题综合.pdf

    2020-08-21 10:31:47
    不合法的用户标识符 A _123 B printf C A $ D Dim 1.表达式3.5+1/2的计算结果是_ 2.对数学表达式 ,写出三个等价的c语言表达式_ } 第三章 练习题 一选择题 1.若a ,b,c都是int型变量且初值为0以下选项中不正确的赋值 ...
  • 这样是合法的和可移植的吗? 2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1;却明确说明能这样做? 2.9 为什么能用内建的==和!=操作符比较结构? 2.10 结构传递和返回是如何实现的? 2.11 如何...
  • 《你必须知道495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    这样是合法的和可移植的吗? 23  2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1却明确说明能这样做? 25 2.9 为什么能用内建的==和!=操作符比较结构? 26 2.10 结构传递和返回是如何实现...
  • c语言练习题

    2013-01-02 12:08:35
    14、 若变量已正确定义并赋值,表达式( )符合C语言语法。 A)4&&3 B)+a C)a=b=5 D)int(3)14) 15、 C语句”x*=y+2;”还可以写作( ) A) x=x*y+2; B) x=2+y*x; C) x=x*(y+2); D) x=y+2*x; 16、 下列...
  • 这为什么是合法的C语言表达式呢?  数组的指针  6.12 既然数组引用会退化为指针,如果array是数组,那么array和&array;又有什么区别呢?  6.13 如何声明一个数组的指针?  动态数组分配  6.14 如何在运行时...
  • 这样是合法的和可移植的吗? 23  2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1却明确说明能这样做? 25 2.9 为什么能用内建的==和!=操作符比较结构? 26 2.10 结构传递和返回是如何实现...
  • c语言你知识点总结

    2018-05-15 00:42:54
    十六进制转义字符:’\x6d’ 才是合法的,前导的0能写,并且x是小写。 3、字符型和整数是近亲:两个具有很大的相似之处  char a = 65 ;  printf(“%c”, a); 得到的输出结果:a printf(“%d”, a); 得到的输出...
  • 190.假设所有变量均为int则表达式a=2,b=5,b++,a+b的值 A7 B8 C6 D2 191....设x,y均为float型变量则以下不合法的赋值语句是 A++x; By=(x%2)/10; Cx*=y+8; Dx=y=0; 193.下面不正确的字符串常量是 Aab
  • [你必须知道的495个C语言问题] 第1章 声明和初始化 基本类型 1.1 我该如何决定...这为什么是合法的C语言表达式呢? 数组的指针 6.12 既然数组引用会退化为指针,如果array是数组,那么array和&array;又有什么区别...
  • 赋值语句是由赋值表达式再加上分号构成表达式语句。 其一般形式为: 变量=表达式; 赋值语句功能和特点都与赋值表达式相同。 它是程序中使用最多语句之一。 在赋值语句使用中需要注意以下几点: 1.由于在...
  • C语言程序设计复习题 一选择题 1.以下选项中可作为C语言合法整数的是 A10110B B0386 C0Xffa Dx2a2 2.以下选项中合法的字符常量是 A) "B" B) '...以下语句语句组中能正确进行字符串赋值的是 A)char *sp*sp="right; B)c
  • *权威解答495个最常遇到的C语言问题 本书以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数...
  • 这样是合法的和可移植的吗? 52 2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1;却明确说明能这样做? 54 2.9 为什么能用内建的==和!=操作符比较结构? 55 2.10 结构传递和返回是如何实现的...
  • 这样是合法的和可移植的吗? 52 2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1;却明确说明能这样做? 54 2.9 为什么能用内建的==和!=操作符比较结构? 55 2.10 结构传递和返回是如何实现的...
  • 这样是合法的和可移植的吗? 2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1却明确说明能这样做? 2.9 为什么能用内建的==和!=操作符比较结构? 2.10 结构传递和返回是如何实现的? 2.11 如何向...
  • 2.赋值语句的值 例如:a=(b=4)+(c=6) 是一个合法的赋值表达式。 (b=4)该表达式的值为4,(c=6)该表达式的值为6。 3.const的定义与运用 4.指针(*p与&p的区别) 5.字符串操作函数 6.a++与++a的区别 7.sizeof(a)...

空空如也

空空如也

1 2 3 4
收藏数 62
精华内容 24
关键字:

不合法的c语言赋值语句是

c语言 订阅