Python 定义了全局变量,但不能使用,类型不对吗

skyshine · February 16, 2021 · Last by 拉布 replied at February 22, 2021 · 2326 hits
from selenium import webdriver

btn = None
def a():
    global btn
    driver = webdriver.Chrome()
    driver.get(url)
    btn = driver.find_element_by_css_selector('XXX')

def b():
     btn...

在 a 里 给 btn 声明了全局变量。
在 b 里不能用。打 btn. 点后不出来 find_element_XXX 那些提示
然后在 上面加了 btn = None 也不行(我也不知道 find_element_by_XXX 声明什么类型就打了 None)

是为什么?

共收到 15 条回复 时间 点赞

a 方法都没有运行过,没法将 btn 重新赋值的;
你这种样式不实用;

from selenium import webdriver


def a():
    global btn
    driver = webdriver.Chrome()
    driver.get(url)
    btn = driver.find_element_by_css_selector('XXX')
    return btn

btn = a()

def b():
     btn...

不是没运行,那只是个例子而已。

pycharm 没那么聪明

b 函数没有 global?

正常的,因为上面代码是 btn 和方法处于同一个级别作用域,大白话来说,对象管理只有下个级别的可以访问上个级别的。
如楼上所说需要把 btn 加一个关键字 global,来标记 btn 是当前文件内全局可以访问的,btn 泛指在堆上的,不同方法之间不共享。
推荐用类来写。

陈子昂 回复

加了 global 也一样的。
btn 需要在多个函数里调用。所以想定义成全局。
return 的话,其它函数用 btn 都跑一遍 a() 没必要。
class 会好点,但已经写完了,只是日常修改,不想在折腾类了,改起来太多

没问题啊

在路上 回复

你那个版本的 pycharm 有点🐂啊,这都没抛错。~看 b() 下面的 print 和 b() 都有提示线了,只是白底不容易显示。

陈子昂 回复

那是因为空格问题,调整了一下格式,就没有了

个人理解:
这种应该只和 python 版本相关,这是编译器的内容。
IDE 不会起决定作用。

在路上 回复

btn 是 webelement 类型。是 driver.find_element_by_css_selector('XXX') 返回的元素对像,不是字符串。

skyshine 回复

代码里面,主要的疑问是 global 变量,跟赋值给 btn 什么值无关吧?

在 b 里不能用。打 btn. 点后不出来 find_element_XXX 那些提示

这没问题吧?btn 又不是 driver 类型,而是 web element 类型。这个类型下面没有 find_element_XXX 这些方法,所以不出现提示很正常呀。

PS:pycharm 不是万能的,有些运行时赋值的东西它不一定都能识别得到,最典型的是通过反射赋值的基本都识别不出来。不能说没有自动提示就认为不能使用,只要程序能跑没问题,就可以了。

PPS:这种在某个函数内突然声明一个 global 变量的写法,demo 写下还可以,正式程序不建议这么写,会非常难找。

找到原因了,你们都错了。。。已解决!!!

skyshine 回复

找到原因了。。顺带说一下原因不是更好吗?😂

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up