V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
css3
V2EX  ›  Python

一个函数,一个变量,整懵逼了

  •  
  •   css3 · 2019-12-05 11:40:41 +08:00 · 11569 次点击
    这是一个创建于 726 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 为什么在 b变量里边 my_time()不再被调用了??
    • 直接打印 print("a"+my_time())时,my_time()每次都会被调用
    • 我要在 b 变量中时时更新 my_time()应该怎么做?
    • 变量是什么😂,什么时候变,什么时候不变?
    >>> import time
    >>> def my_time():
    ... 	return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    >>>
    >>> my_time()
    '2019-12-05 11:29:47'
    >>> my_time()
    '2019-12-05 11:29:50'
    >>> b = "a"+my_time()
    >>> b
    'a2019-12-05 11:30:32'
    >>> b
    'a2019-12-05 11:30:32'
    >>> b
    'a2019-12-05 11:30:32'
    
    
    >>> print("a"+my_time())
    a2019-12-05 11:38:02
    >>> print("a"+my_time())
    a2019-12-05 11:38:03
    >>> print("a"+my_time())
    a2019-12-05 11:38:05
    
    
    
    >>> b = "a" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    >>> b
    'a2019-12-05 11:39:27'
    >>> b
    'a2019-12-05 11:39:27'
    >>> b
    'a2019-12-05 11:39:27'
    >>> 
    
    
    >>> "a" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    'a2019-12-05 11:41:58'
    >>> "a" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    'a2019-12-05 11:41:59'
    >>> "a" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    'a2019-12-05 11:42:00'
    >>> "a" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    'a2019-12-05 11:42:00'
    >>> "a" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    'a2019-12-05 11:42:01'
    >>> "a" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    'a2019-12-05 11:42:02'
    >>> 
    
    第 1 条附言  ·  2019-12-06 09:06:32 +08:00

    让v站大佬见笑了

    那为什么在编辑器里边b每次都是被调用的?

    kn6yVt.png

    116 条回复    2019-12-07 00:46:36 +08:00
    1  2  
    j0hnj
        1
    j0hnj   2019-12-05 11:48:04 +08:00   ❤️ 54
    唉,要不还是转行吧
    Caballarii
        2
    Caballarii   2019-12-05 11:48:49 +08:00   ❤️ 1
    b 变量是"a"+my_time()执行的结果,类型是字符串,字符串凭什么变,
    b 写成函数每次调用才会每次执行
    io123
        3
    io123   2019-12-05 11:50:08 +08:00 via Android
    唉,要不还是转行吧
    jimliang
        4
    jimliang   2019-12-05 11:52:40 +08:00
    唉,要不还是转行吧
    mmixxia
        5
    mmixxia   2019-12-05 11:53:56 +08:00
    变量在赋值的时候变化。
    mmixxia
        6
    mmixxia   2019-12-05 11:54:06 +08:00
    唉,要不还是转行吧
    xem
        7
    xem   2019-12-05 11:55:51 +08:00
    唉,要不还是转行吧
    littleylv
        8
    littleylv   2019-12-05 11:57:39 +08:00
    唉,要不还是转行吧
    css3
        9
    css3   2019-12-05 11:58:01 +08:00
    @css3 @j0hnj @Caballarii @io123 @jimliang @mmixxia @xem @littleylv
    准备转了,各位不要再说了
    JeffGe
        10
    JeffGe   2019-12-05 11:58:15 +08:00 via Android
    唉,要不还是转行吧
    b821025551b
        11
    b821025551b   2019-12-05 11:59:03 +08:00
    b 是你函数执行的结果,如果你想要它“变”,需要把 b 赋值成闭包;
    初学者的话出这种疑问很正常,但是看你的回复又不像初学者,那么转行吧:doge:
    dswyzx
        12
    dswyzx   2019-12-05 11:59:33 +08:00
    python 就是捉急.别学了
    面向对象语言 强类型.
    断点调试看变量 啥都给你整明白了
    JCZ2MkKb5S8ZX9pq
        13
    JCZ2MkKb5S8ZX9pq   2019-12-05 12:04:08 +08:00
    唉,教程从头再看一遍吧。
    my_time 是函数
    my_time() 是它返回的结果 是字符串
    你的 b 一开始就字符串 a+字符串函数返回的结果

    要跟着变你可以把那个 a+写到 return 里

    不过还是建议从头看教程吧
    Trim21
        14
    Trim21   2019-12-05 12:04:15 +08:00 via Android
    你这想要的是 class 的 property 啊
    ddzzhen
        15
    ddzzhen   2019-12-05 12:05:08 +08:00 via Android
    大佬请不要对新手这么残忍,楼主肯定是初学者,我上班也基本不用 python,准确的说不用代码,当初学的时候有很多这种类似的问题,现在写量化脚本也不用类,不是每个 python 人都用 python 养活自己,毕竟门槛太低了
    sheep3
        16
    sheep3   2019-12-05 12:10:06 +08:00
    不是,你转行之前干啥的

    这不是基础到极点的东西么......
    xiaofan305
        17
    xiaofan305   2019-12-05 12:12:21 +08:00 via Android
    唉,要不还是转行吧
    wuwukai007
        18
    wuwukai007   2019-12-05 12:15:52 +08:00 via Android   ❤️ 1
    python 是简单,那是针对有其它语言经验的人,建议不要走马观花,静下心来,从头学起
    gov
        19
    gov   2019-12-05 12:22:44 +08:00   ❤️ 12
    不知道楼上劝转行的人是什么资质。面对初学者的心态难道不是包容和引导吗?
    在这个帖子 /t/625470 里看到了大家对心胸狭隘的抨击,那复读灌水劝退内容算不算心胸狭隘呢?
    回帖前请注意右下角的“请尽量让自己的回复能够对别人有帮助”以及阅读 /about
    MeteorCat
        20
    MeteorCat   2019-12-05 12:24:42 +08:00 via Android
    唉,要不还是转行吧
    levelworm
        21
    levelworm   2019-12-05 12:26:42 +08:00   ❤️ 1
    b 是个字符串,所以你每次打 b 无非就是出来字符串里头的内容。严格地说是 b 这个 name 指示的地址里头的内容。你可以再次给 b 赋值,就会变化了。但是这时候其实是指向另外一个地址。

    ```
    >>>b
    'a2019-12-04 23:20:53'
    >>>hex(id(b))
    '0x2126325b580'
    >>>b = "a" + my_time()
    >>>b
    'a2019-12-04 23:21:15'
    >>>hex(id(b))
    '0x2126325b850'
    ```
    yupnano
        22
    yupnano   2019-12-05 12:35:33 +08:00
    唉,要不还是转行吧
    superrichman
        23
    superrichman   2019-12-05 12:35:54 +08:00 via iPhone
    python 可以通过
    print(type(b))
    来看变量 b 的数据类型。应该会看到类似 class str 的输出,说明 b 的值是个字符串 string,而字符串在定义了之后是不会改变的。要“修改”字符串 只能新建另一个再赋值给 b。
    hoyixi
        24
    hoyixi   2019-12-05 12:38:27 +08:00   ❤️ 1
    my_time: 小 b,你好,我是印钞机,只是把印好的一张 100 块给你了,并没有把我自己给你
    mckelvin
        25
    mckelvin   2019-12-05 12:47:25 +08:00 via Android
    () 长的像硬币不?得投一次币才给干一次活。
    ThomasZ
        26
    ThomasZ   2019-12-05 12:48:32 +08:00 via Android
    跨行学 Python ?不要上手就开搞,先看看基础理论再说
    wangyzj
        27
    wangyzj   2019-12-05 12:54:09 +08:00
    唉,要不还是转行吧
    ClarkAbe
        28
    ClarkAbe   2019-12-05 13:02:06 +08:00 via Android
    唉,要不还是转行吧,秋梨膏
    leido
        29
    leido   2019-12-05 13:22:07 +08:00
    xswl, 哈哈哈哈
    RV0n
        30
    RV0n   2019-12-05 13:28:01 +08:00
    唉,要不还是转行吧
    kasper4649
        31
    kasper4649   2019-12-05 13:32:04 +08:00 via Android
    建议还是从基础学吧,搞懂字符串再说
    wizardoz
        32
    wizardoz   2019-12-05 13:32:04 +08:00
    你是不是看了抖音决定学 Python 的?
    shfanzie
        33
    shfanzie   2019-12-05 13:33:51 +08:00
    唉,要不还是转行吧
    gz911122
        34
    gz911122   2019-12-05 13:34:07 +08:00
    唉,要不还是转行吧
    ZRS
        35
    ZRS   2019-12-05 13:42:59 +08:00
    建议从 C 开始 先把 C 的基础语法整明白了 写几个算法题 再开始 Python
    hanyceZ
        36
    hanyceZ   2019-12-05 13:43:21 +08:00
    唉,要不还是转行吧
    CrazyRain0001
        37
    CrazyRain0001   2019-12-05 13:48:14 +08:00
    火钳刘明
    misaka19000
        38
    misaka19000   2019-12-05 13:53:39 +08:00   ❤️ 3
    函数式对行为的一种抽象,变量代表了一个状态

    PS: 楼上的队形党太拉低 V 站水平了
    ljpCN
        39
    ljpCN   2019-12-05 13:53:44 +08:00   ❤️ 3
    楼主很适合学习函数式编程
    wutiantong
        40
    wutiantong   2019-12-05 13:58:58 +08:00   ❤️ 3
    这就劝人转行?

    lazy evaluation 了解一下?

    楼主的思维方式很有意义。

    劝某些人不要太僵化。
    raistlin916
        41
    raistlin916   2019-12-05 14:01:59 +08:00   ❤️ 1
    问题出在中文歧义上,字面上看,『变量』其实是可变量,执行函数是『变某量』,所以容易混淆。
    MinQ
        42
    MinQ   2019-12-05 14:04:37 +08:00
    唉,要不还是转行吧
    KaynW
        43
    KaynW   2019-12-05 14:08:45 +08:00
    已学者往往理解不了初学者为什么会提出这种问题.是个啥理论还是悖论来着,忘了.多点宽容多点爱
    simenet
        44
    simenet   2019-12-05 14:10:17 +08:00
    唉,要不还是转行吧
    唉,要不还是转行吧
    唉,要不还是转行吧
    唉,要不还是转行吧
    cppgohan
        45
    cppgohan   2019-12-05 14:17:48 +08:00
    楼主是要钓鱼赚波金币?
    yinjy
        46
    yinjy   2019-12-05 14:20:18 +08:00
    为什么要嘲讽楼主,其实这个问题还是挺有意思的
    Vindroid
        47
    Vindroid   2019-12-05 14:25:03 +08:00
    没有基本功?耐下性子从最基本的学起吧,你这样学容易走火入魔啊
    yeze322
        48
    yeze322   2019-12-05 14:32:33 +08:00
    楼上都太欢乐了
    j0hnj
        49
    j0hnj   2019-12-05 14:40:05 +08:00   ❤️ 5
    楼主,非常对不起,一时没忍住,嘴欠了一下,做了个坏一楼,确实太 mean 了。
    能对初学者讲明白最基础的问题,才是真正的大佬,引以为戒。
    williamszz
        50
    williamszz   2019-12-05 14:41:02 +08:00
    唉,要不还是转行吧
    jon
        51
    jon   2019-12-05 14:43:00 +08:00
    唉,要不还是转行吧
    hallwoodzhang
        52
    hallwoodzhang   2019-12-05 14:46:12 +08:00   ❤️ 2
    >>> import time
    >>> def my_time():
    ... return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    ...
    >>> b = lambda : 'a' + my_time()
    >>> b
    <function <lambda> at 0x7fdc8494f840>
    >>>
    >>> b()
    'a2019-12-05 14:43:58'
    >>> b()
    'a2019-12-05 14:44:01'
    >>> b()
    'a2019-12-05 14:44:04'
    >>>
    hallwoodzhang
        53
    hallwoodzhang   2019-12-05 14:48:30 +08:00   ❤️ 2
    我猜你想要这种效果
    azcvcza
        54
    azcvcza   2019-12-05 14:50:54 +08:00
    不知道是钓鱼还是被钓
    Tokin
        55
    Tokin   2019-12-05 15:07:51 +08:00
    我滴妈呀,这个不应该入门就应该懂的吗?钓鱼贴?
    Phishion
        56
    Phishion   2019-12-05 15:14:56 +08:00   ❤️ 1
    上面列队劝人家转行的,有几个能非常深入的从底层讲解透这个问题的?当复读机能显得你们特别高明?我觉得吧,如果不会说话,可以不要说嘛,别回来往深了问一个个哑火了,挤兑别人倒有一手。
    ermao
        57
    ermao   2019-12-05 15:18:01 +08:00
    string b = "a" + my_time();

    加上 string 你明白了吗?它把赋值那一刻的 my_time() 存了起来。所以你无论输出多少次,它都不会变呀。
    imklay
        58
    imklay   2019-12-05 15:21:28 +08:00
    我觉得还挺可爱的。。
    crella
        59
    crella   2019-12-05 15:24:43 +08:00
    玩玩 ruby 的 eval、instance_eval、class_eval,玩得让我头痛欲裂
    leadersnowy
        60
    leadersnowy   2019-12-05 15:25:48 +08:00
    唉,要不还是转行吧
    crella
        61
    crella   2019-12-05 15:30:36 +08:00
    还有提醒楼主,在绝大多数语言中,数组 a = 数组 b,这个操作是引用传递,就是当后续更改了数组 b 的某个元素的值后,数组 a 也会发生对应的变化。在你使用的语言中,一定要先查查语言的深拷贝(deepcopy 方法)
    mara1
        62
    mara1   2019-12-05 15:31:25 +08:00
    楼主别听他们的,谁都是一点点学的,慢慢来,自己不要气馁。

    基于你初学者的身份,建议你先谷歌,或找同事问,效率更高,如果还解决不了,再去网上问。
    VShawn
        63
    VShawn   2019-12-05 15:35:45 +08:00
    我猜测楼主是想用闭包?

    要不还是转行吧
    Nugine0
        64
    Nugine0   2019-12-05 15:53:32 +08:00
    ```
    $ cat a.py
    import time

    def get_time():
    return time.strftime(
    '%Y-%m-%d %H:%M:%S',
    time.localtime(time.time()))

    class TimeStr(str):
    def __str__(self):
    return get_time()
    def __repr__(self):
    return get_time()

    b = TimeStr()
    for i in range(5):
    print(f"{i+1}: {b}")
    time.sleep(1)

    $ python a.py
    1: 2019-12-05 15:50:57
    2: 2019-12-05 15:50:58
    3: 2019-12-05 15:50:59
    4: 2019-12-05 15:51:00
    5: 2019-12-05 15:51:01
    $
    ```
    Ainndy
        65
    Ainndy   2019-12-05 16:00:36 +08:00 via iPhone
    唉,要不还是转行吧
    HanShan63
        66
    HanShan63   2019-12-05 16:03:16 +08:00
    唉,要不还是转行吧
    blackccc
        67
    blackccc   2019-12-05 16:03:23 +08:00
    变量就是 72 变,想怎么变就怎么变
    zixiaoguan
        68
    zixiaoguan   2019-12-05 16:10:39 +08:00
    代码是一行一行执行的,b 在赋值的时候已经执行了那段代码,以后就不会执行了。每次需要反复执行的代码,那种代码叫做函数。
    neroxps
        69
    neroxps   2019-12-05 16:15:58 +08:00
    楼主标题写的很好,什么是变量,什么是函数,楼主搞清楚就是了。

    正如 bash

    ```bash
    time(){
    echo date
    }

    echo "a $(time)"

    # 和 echo "a $(date)" 是一个意思啊。

    ```

    函数每次调用都会执行,而变量只是存在一个内存空间的东西,变量在不被别人修改的时候是不会变化的。函数是动态的,调用就执行一次。

    函数是动词,变量是形容词。
    neroxps
        70
    neroxps   2019-12-05 16:17:03 +08:00
    @neroxps #69 手残连 bash 都敲错

    ```bash
    time(){
    echo $(date)
    }

    echo "a $(time)"

    # 和 echo "a $(date)" 是一个意思啊。

    ```
    pb941129
        71
    pb941129   2019-12-05 16:32:28 +08:00   ❤️ 1
    ?我开始怀疑这个论坛的专业性...
    HonoSV
        72
    HonoSV   2019-12-05 16:56:00 +08:00
    别学 python,来学 java 吧,好懂很多
    CosimoZi
        73
    CosimoZi   2019-12-05 17:00:48 +08:00
    楼主很适合学习函数式编程
    solgh
        74
    solgh   2019-12-05 17:02:09 +08:00
    唉,要不还是转行吧
    madmen
        75
    madmen   2019-12-05 17:08:55 +08:00
    是不是买了朋友圈推送的,1 天学会 python ?
    这个是计算机基础知识,先去恶补一下基础知识会比较好。
    Erroad
        76
    Erroad   2019-12-05 18:11:37 +08:00 via iPhone
    楼主要不去玩玩人力资源机器?
    HolmLoh
        77
    HolmLoh   2019-12-05 18:13:32 +08:00   ❤️ 1
    他们都只是调侃而已,不比挂在心上
    建议去看一些关于计算机书和 Python 的基本语法,应该会对你大有帮助

    这里主要是两个点
    一个是 my_time(),每次使用“my_time()”的时候,则会调用一次“my_time()”这个函数,而函数的每次调用都会执行一次函数对象的代码,所以每次调用就相当于生成一个新的值
    第二是 b = ,这个是定义一个遍历 b,并赋值,使用“=”赋值之后,只要变量“b”不被再次使用“=”覆盖掉原值,他的数据就不会变

    通俗的讲就是,你有一个文具袋( my_time ()),你从箱子里面拿出一支笔(调用函数),随后放到你的桌子上(赋值给 b ),随后你就可以看到桌子上的笔了(打印 b ),在你从文具袋里拿去物品(调用函数)并且放到桌子上,你桌子上永远都会是那支笔

    我水平有限,解释的不好见谅
    Mistwave
        78
    Mistwave   2019-12-05 18:20:29 +08:00 via iPhone
    b = "a"+my_time()
    这里是 call by value,而不是 call by name
    leeleelee
        79
    leeleelee   2019-12-05 18:24:00 +08:00 via Android
    @KaynW 知识的诅咒
    xuyl
        80
    xuyl   2019-12-05 18:33:21 +08:00 via Android
    要不转行吧
    winglight2016
        81
    winglight2016   2019-12-05 18:53:35 +08:00
    唉,要不还是转行吧
    lewinlan
        82
    lewinlan   2019-12-05 19:06:08 +08:00
    唉,要不还是转行吧

    变量想象成是一个标签,你赋值给谁它就代表谁。你令『 b = "a"+my_time()』,程序会把右边的*值*计算出来,然后给这个*值*贴上『 b 』这个标签,所以你每次访问都是同一个值。

    另外,你打印时间字符串可以用『 datetime.now().strftime("%Y%m%d")』你那样写太别扭了。
    nomaka
        83
    nomaka   2019-12-05 19:06:11 +08:00
    唉,要不还是转行吧
    ztmqg
        84
    ztmqg   2019-12-05 19:10:19 +08:00 via iPhone
    楼主别听他们的,加油吧!
    楼上的复读机有意思么?
    vipppppp
        85
    vipppppp   2019-12-05 19:26:49 +08:00
    。。。
    liuzhiyong
        86
    liuzhiyong   2019-12-05 19:43:55 +08:00
    楼主应该是初学啦。“变量是什么”:就是计算机内存里面保存的一些数据。“什么时候变,什么时候不变?”:计算机 CPU 执行修改内存的指令,它就变了,如果 CPU 执行读取内存的指令,它当然不变。
    SpaceVim
        87
    SpaceVim   2019-12-05 19:50:34 +08:00
    @css3 楼上所有人都是只会人云亦云,自己一点脑子没有的人,这种问题难道真的没有实现方式么?

    输入,b,实际上是调用 b 的 tostring 函数,哪怕是我真的没有深入学过 python, 我都知道任意面向对象类型的语言都可以实现这样的事情。
    leafsummer
        88
    leafsummer   2019-12-05 19:58:06 +08:00
    唉,要不还是转行吧
    smdbh
        89
    smdbh   2019-12-05 20:02:27 +08:00 via iPhone
    @j0hnj 谢谢指明了我的人生方向,这比告诉我答案意义更大。

    这个问题和深拷贝,指针,引用等,都是语言的“通病”,就像 1024 一样习惯就好
    asche910
        90
    asche910   2019-12-05 20:07:38 +08:00
    唉,要不还是转行吧
    vipppppp
        91
    vipppppp   2019-12-05 20:50:34 +08:00
    我只是觉得大家没必要探讨 python 的__str__问题
    劝转行是有点过分,但在这个论坛看到这样的问题确实相对太过于基础,难免有点震惊。
    无论怎么样,还是要学好最基本的一些编程知识,LZ 加油。。
    bjt
        92
    bjt   2019-12-05 20:58:50 +08:00
    唉,要不还是转行吧
    CodeCore
        93
    CodeCore   2019-12-05 21:01:02 +08:00
    楼主不要灰心。。。
    你发现了更大到世界。
    CEBBCAT
        94
    CEBBCAT   2019-12-05 21:57:02 +08:00
    > 为什么在 b 变量里边 my_time()不再被调用了??
    你给 b 赋值(比如 b = a + XXX )的时候,值已经固定了,是一个像'a2019-12-05 11:30:32'一样的字符串,你可以用 type(b)来验证。
    > 直接打印 print("a"+my_time())时,my_time()每次都会被调用
    print 里边的"a"+my_time()是一个表达式,所以每次执行都会对 my_time()求值
    > 我要在 b 变量中时时更新 my_time()应该怎么做?
    def b():
    return "a"+my_time()
    > 变量是什么😂,什么时候变,什么时候不变?
    基础问题,请完整看完一本编程书再问这样的问题。
    ---
    楼主什么身份?行外的朋友?要是培训班出来能被这几个问题难住,我想这个培训班把你和行业坑得不轻
    zhjie
        95
    zhjie   2019-12-05 22:24:33 +08:00
    真不是我偏见,10 个钓鱼的 9 个是苹果头像!?
    ahaxzh
        96
    ahaxzh   2019-12-06 09:28:17 +08:00
    哎,还挺难的。不然跟我回家养猪算了。
    css3
        97
    css3   2019-12-06 09:33:36 +08:00
    @ahaxzh 可以,但养猪前,能先让我明白我问的问题这是为什么吗?
    chucongqing
        98
    chucongqing   2019-12-06 09:34:21 +08:00
    一楼二楼都点赞了
    finalwave
        99
    finalwave   2019-12-06 09:55:06 +08:00
    都叫 css3 了,不做前端学什么 python
    galikeoy
        100
    galikeoy   2019-12-06 09:56:10 +08:00
    @css3 #97 上面的大佬已经多种维度来解释了,还是看不懂的建议先看一些编程基础
    1  2  
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4228 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 06:19 · PVG 14:19 · LAX 22:19 · JFK 01:19
    ♥ Do have faith in what you're doing.