Python循环中全局变量timestamp持续重置导致Excel索引异常问题求助
问题根源:导入的变量与模块全局变量不同步
你遇到的这个问题,核心原因是**from dataGet import * 会把模块中的变量复制到当前脚本的命名空间,而不是引用模块里的原始变量**。也就是说,你主脚本里的 timestamp 和 dataGet 模块里的 timestamp 是两个完全独立的变量:
- 当你调用
getTimestamp()时,函数修改的是dataGet模块内部的全局timestamp; - 但你创建 DataFrame 时使用的是主脚本里已经导入的、初始值为0的
timestamp,自然会得到1969/12/31这个Unix时间戳0对应的日期。
非循环场景下正常,大概率是因为你在单次执行中,导入后立即调用函数并使用,没触发命名空间的变量隔离问题。
解决方案1:避免全局变量,让函数返回时间戳(推荐)
全局变量很容易引发这类作用域混乱,最佳实践是让 getTimestamp() 直接返回获取到的时间戳,彻底摆脱全局变量依赖:
修改 dataGet.py:
def getTimestamp(): return int(client.get_server_time()['serverTime'])/1000
主脚本中调用并使用返回值:
# 替换原有的 getTimestamp() 调用 current_timestamp = getTimestamp() # 创建DataFrame时直接使用这个返回值 df = pd.DataFrame(holdings, index=[datetime.datetime.fromtimestamp(current_timestamp).strftime('%Y/%m/%d')])
这种写法代码更清晰,也从根源上避免了作用域问题。
解决方案2:导入模块而非直接导入变量
如果一定要保留全局变量的写法,可以改为导入整个模块,通过模块访问变量,确保每次用的都是模块内部的最新值:
主脚本修改导入语句:
import dataGet
调用函数和使用变量时:
dataGet.getTimestamp() # 创建DataFrame时直接访问模块里的timestamp df = pd.DataFrame(holdings, index=[datetime.datetime.fromtimestamp(dataGet.timestamp).strftime('%Y/%m/%d')])
这样就能直接使用 dataGet 模块里被函数修改后的 timestamp 值,不会出现变量不同步的问题。
解决方案3:重新导入变量(不推荐)
如果坚持使用 from dataGet import *,可以在调用 getTimestamp() 后重新导入 timestamp,但这种写法不够优雅,且容易出错:
getTimestamp() # 重新导入最新的timestamp值 from dataGet import timestamp
不建议用这种方法,会增加代码复杂度,不如前两种方案简洁可靠。
内容的提问来源于stack exchange,提问作者Lucas Teixeira
相关产品推荐
相关产品推荐

